You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  1. 使用JOIN会过滤掉没有成绩记录的学生,这类学生无法出现在结果里;
  2. CASE直接判断单条marks是否为NULL,没考虑学生所有成绩的整体情况;
  3. 聚合函数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按学生维度聚合,计算有效成绩的总分。
预期输出示例
idnamegenderagetotal
1MikeMale18500
2SamMale17Absent
3MarthaFemale18400

内容的提问来源于stack exchange,提问作者Knight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:10:29