SQL查询需求:计算学生总分,全缺考时显示'Absent'
表结构说明
- student表:
id、name、gender、dob - studentmarks表:
stId、subject、marks(同一学生有多条记录,对应多科成绩) - studentage表:
studentId、age
注:
id、stId、studentId为同一字段(学生ID)
需求
需计算并展示每位学生的id、name、gender、age及总分:
- 若学生至少有一科有成绩,则显示总分;
- 若所有科目
marks字段均为空/NULL,则显示Absent替代总分。
原SQL存在的问题
你尝试的SQL语句效果不佳,问题出在这几点:
select s.id,name,gender,case marks is null then 'Absent' else sum(marks) end as total from student s join studentmarks sm on s.id = sm.stId join studentage sa on sa.studentid = s.id
- 使用
JOIN会过滤掉没有成绩记录的学生,这类学生无法出现在结果里; CASE直接判断单条marks是否为NULL,没考虑学生所有成绩的整体情况;- 聚合函数
sum(marks)和非聚合字段混用却没加GROUP BY,语法错误。
修正后的SQL语句
用LEFT JOIN关联成绩表保证所有学生都能被查询到,再通过聚合逻辑判断成绩状态:
SELECT s.id, s.name, s.gender, sa.age, CASE WHEN COUNT(sm.marks) = 0 THEN 'Absent' ELSE SUM(sm.marks) END AS total FROM student s LEFT JOIN studentmarks sm ON s.id = sm.stId JOIN studentage sa ON sa.studentId = s.id GROUP BY s.id, s.name, s.gender, sa.age;
逻辑说明:
LEFT JOIN studentmarks确保无成绩记录的学生也能出现在结果中;COUNT(sm.marks)统计非NULL的成绩条数,为0则说明所有成绩都是NULL,显示Absent;GROUP BY按学生维度聚合,计算有效成绩的总分。
预期输出示例
| id | name | gender | age | total |
|---|---|---|---|---|
| 1 | Mike | Male | 18 | 500 |
| 2 | Sam | Male | 17 | Absent |
| 3 | Martha | Female | 18 | 400 |
内容的提问来源于stack exchange,提问作者Knight
相关产品推荐
相关产品推荐

