使用SQL的SUM()、GROUP BY与连接查询统计学生修读学分总和
修正SQL实现按学生分组统计总学分
原SQL存在两个核心问题:
- 未关联
students和registration表,导致三张表产生笛卡尔积,计算出的是所有课程学分的重复总和,而非按学生分组的结果 - 分组字段不完整,在严格SQL模式下会触发语法错误(非聚合列必须出现在GROUP BY中)
修正后的SQL(仅统计有选课记录的学生)
SELECT s.studentID, s.firstName, s.lastName, SUM(c.credits) AS total_credits FROM students s JOIN registration r ON s.studentID = r.studentID JOIN courses c ON r.courseCode = c.courseCode GROUP BY s.studentID, s.firstName, s.lastName;
扩展:统计所有学生(含未选课的学生,总学分显示0)
如果需要包含没有选课记录的学生,使用LEFT JOIN处理:
SELECT s.studentID, s.firstName, s.lastName, COALESCE(SUM(c.credits), 0) AS total_credits FROM students s LEFT JOIN registration r ON s.studentID = r.studentID LEFT JOIN courses c ON r.courseCode = c.courseCode GROUP BY s.studentID, s.firstName, s.lastName;
关键说明
- 使用显式JOIN语法替代隐式逗号分隔,表关联逻辑更清晰,彻底避免笛卡尔积问题
GROUP BY包含所有非聚合字段(studentID、firstName、lastName),符合SQL标准规范COALESCE函数用于将未选课学生的SUM结果(NULL)转换为0,保证输出结果的统一性
内容的提问来源于stack exchange,提问作者bchennnn
相关产品推荐
相关产品推荐

