不使用子查询如何通过CASE语句统计符合成绩条件的学生数量
现有查询问题说明
- A等级数量判断逻辑错误:你写的
sum(...) > 2要求学生至少获得3个A,不符合需求中「2个A」的要求,需要调整为>=2 - 仅返回符合条件的学生名/NULL值,没有做最终的计数聚合
符合要求的改写方案(无任何子查询)
SELECT COUNT(DISTINCT CASE WHEN SUM(CASE WHEN grade = 5 THEN 1 ELSE 0 END) >= 2 AND SUM(CASE WHEN grade = 2 THEN 1 ELSE 0 END) >= 1 THEN student ELSE NULL END) AS qualified_student_total FROM grades GROUP BY student
如果使用的SQL方言支持布尔表达式直接求和(比如MySQL),可以简化为更短的写法:
SELECT COUNT(DISTINCT CASE WHEN SUM(grade = 5) >= 2 AND SUM(grade = 2) >= 1 THEN student ELSE NULL END) AS qualified_student_total FROM grades GROUP BY student
实现逻辑说明
- 先按学生维度分组,统计每个学生的A等级(grade=5)、D等级(grade=2)的获得次数
- 用CASE语句对满足「2个及以上A、至少1个D」的学生返回学生名,不满足的返回NULL
- 利用COUNT函数自动忽略NULL值的特性,配合DISTINCT去重,直接统计得到符合条件的学生总人数,完全符合禁止子查询的要求。
内容的提问来源于stack exchange,提问作者Lunae Lumen
相关产品推荐
相关产品推荐

