如何通过SQL Group By按自定义逻辑聚合列计算学生综合成绩?
自定义逻辑聚合学生成绩的SQL实现
需求说明
仅当学生所有科目Result均为PASS时,综合成绩标记为PASS;只要有任意一科Result为非PASS(包括FAILED、GRACE、SUPPLYMENT等),综合成绩标记为FAILED。
解决方案
假设原始成绩表名为student_scores,通过GROUP BY分组结合条件判断即可实现需求,以下是两种简洁可行的写法:
写法一:统计非PASS科目数量
SELECT Student_id, CASE WHEN COUNT(CASE WHEN Result != 'PASS' THEN 1 END) = 0 THEN 'PASS' ELSE 'FAILED(学生任一科目不及格则综合成绩为不及格)' END AS overall_result FROM student_scores GROUP BY Student_id;
逻辑解析:
COUNT(CASE WHEN Result != 'PASS' THEN 1 END)会统计当前学生所有非PASS科目的数量- 若统计结果为0,说明所有科目都是PASS,返回
PASS;否则返回带备注的FAILED
写法二:用标识值判断全PASS状态
SELECT Student_id, CASE WHEN MIN(CASE WHEN Result = 'PASS' THEN 1 ELSE 0 END) = 1 THEN 'PASS' ELSE 'FAILED(学生任一科目不及格则综合成绩为不及格)' END AS overall_result FROM student_scores GROUP BY Student_id;
逻辑解析:
- 内层
CASE将PASS转为1,其他结果转为0 MIN()函数取该学生所有科目的标识值最小值,若最小值为1,说明所有科目都是1(即全PASS);否则存在非PASS科目
测试结果验证
针对你提供的测试数据,两种写法都会输出符合预期的结果:
| Student_id | overall_result |
|---|---|
| 123 | FAILED(学生任一科目不及格则综合成绩为不及格) |
| 456 | PASS |
内容的提问来源于stack exchange,提问作者voila
相关产品推荐
相关产品推荐

