hive数据库有一张学生表和一张班级表,学生表有学生ID,name,语文 数学,英文 ,班级id,班级表有classid和classname,编写一个SQL算出每个班级的语文数学英语的平均成绩
时间: 2024-10-27 09:13:48 浏览: 15
你可以使用Hive SQL的JOIN和GROUP BY语句来实现这个需求。假设学生的成绩存储在一个名为`grades`的临时表中,其结构包括`student_id`, `subject`(如语文、数学、英文),以及`score`字段。这里是一个示例查询:
```sql
CREATE TEMPORARY TABLE grades
AS
SELECT s.student_id, g.subject, g.score
FROM students s
JOIN (
SELECT classid, subject, AVG(score) as avg_score
FROM scores
GROUP BY classid, subject
) g ON s.classid = g.classid;
SELECT classname, '语文' AS Chinese_Avg, '数学' AS Math_Avg, '英文' AS English_Avg
FROM grades
WHERE subject IN ('语文', '数学', '英文')
GROUP BY classname;
```
在这个查询中,首先通过JOIN将学生表(`students`)和分数表(`scores`)关联起来,并计算每个班级每门学科的平均分。然后,从临时表中选择出每个班级的语文、数学和英文的平均成绩。
相关问题
hive sql 学生表里s_id s_name 成绩表里有s_id score ,现在需要查询平均成绩大于等于60分的学生编号和学生姓名和平均成绩
可以使用如下的Hive SQL语句:
```
SELECT s.s_id, s.s_name, AVG(sc.score) AS avg_score
FROM student s
JOIN score sc ON s.s_id = sc.s_id
GROUP BY s.s_id, s.s_name
HAVING AVG(sc.score) >= 60;
```
该语句使用了INNER JOIN将学生表和成绩表连接起来,然后使用GROUP BY对学生编号和姓名进行分组,最后使用HAVING筛选出平均成绩大于等于60分的学生。使用AVG函数计算平均成绩,并将其命名为avg_score。
问题:给定两张表(学生课程成绩表,学生班级表),写出如下两个sql 学生课程成绩表:table_course_grade,包含字段:course_id course_name student_id student_name course_grade 学生班级表: table_class_student,包含字段:class_id class_name student_id student_name 1、写出sql,"计算学生数量,这些同学的总分大于150分,平均分小于90分"。 2、写出hivesql并解释,"列出各个班级的名称和总分值"。
答案:
1、计算学生数量,这些同学的总分大于150分,平均分小于90分的SQL语句:
```sql
SELECT COUNT(DISTINCT student_id)
FROM table_course_grade
GROUP BY student_id
HAVING SUM(course_grade) > 150 AND AVG(course_grade) < 90;
```
2、列出各个班级的名称和总分值的HiveSQL语句:
```sql
SELECT c.class_name, SUM(g.course_grade) as total_grade
FROM table_class_student c
JOIN table_course_grade g
ON c.student_id = g.student_id
GROUP BY c.class_name;
```
该语句使用了INNER JOIN将两个表连接起来,在GROUP BY语句中按照班级名称进行分组,并使用SUM函数计算每个班级的总分。最后,SELECT语句选择班级名称和总分作为输出结果。
阅读全文