如何在SQL中为每个学生计算考试及实验+项目两类平均分?
解决方案:同时计算考试平均分与实验+项目平均分
原SQL通过HAVING子句只保留了考试('e')类型的记录,所以没法同时计算实验和项目的平均分。你可以用条件聚合函数来实现需求,不用过滤其他类型的记录,直接在聚合时指定计算范围即可。
按学生+课程维度统计的SQL
SELECT s.id AS student_id, s.name AS student_name, c.name AS course_name, AVG(CASE WHEN g.grade_type = 'e' THEN g.mark END) AS "Average Exam Grade", AVG(CASE WHEN g.grade_type IN ('l', 'p') THEN g.mark END) AS "Average Activity Grade" FROM Students s JOIN Course_Signup csn ON s.id = csn.student_id JOIN Courses c ON c.id = csn.course_id JOIN Grades g ON g.signup_id = csn.id GROUP BY s.id, s.name, c.name ORDER BY s.id ASC
按学生整体维度统计的SQL(不区分课程)
如果不需要按课程拆分,只看每个学生所有考试、所有实验+项目的平均分,可以调整分组条件:
SELECT s.id AS student_id, s.name AS student_name, AVG(CASE WHEN g.grade_type = 'e' THEN g.mark END) AS "Average Exam Grade", AVG(CASE WHEN g.grade_type IN ('l', 'p') THEN g.mark END) AS "Average Activity Grade" FROM Students s JOIN Course_Signup csn ON s.id = csn.student_id JOIN Grades g ON g.signup_id = csn.id GROUP BY s.id, s.name ORDER BY s.id ASC
关键说明
- 用
CASE WHEN在AVG函数里做筛选:只有符合条件的成绩才会被纳入对应平均分的计算,不符合的会被视为NULL,AVG会自动忽略NULL值。 - 删掉了原SQL的子查询和
HAVING子句,直接关联表后分组,这样能同时保留所有成绩类型的数据用于计算。
内容的提问来源于stack exchange,提问作者Andrei0408
相关产品推荐
相关产品推荐

