SQL Server:WHERE子句不能用聚合函数时,如何筛选不及格学生超20人的科目
正确实现需求的SQL写法及问题解析
先拆解下你原语句的核心问题,再一步步修正:
你的需求逻辑是先找出所有不及格(TotalMarks < 35)的学生记录,再按科目分组统计不及格人数,最后筛选出人数超20的科目,但原语句犯了两个关键错误:
- 行级筛选条件放错位置:
TotalMarks < 35是针对单条学生记录的过滤,应该用WHERE子句(过滤行),而非HAVING(HAVING是过滤分组后的聚合结果) HAVING子句逻辑混乱:分组后已经没有单条记录的TotalMarks值了,直接引用会报错,而且把行筛选和聚合筛选混在了一起
正确的SQL语句
SELECT SubjectId, COUNT(SubjectId) AS StudentsFailed FROM tblResults WHERE TotalMarks < 35 -- 先筛选出所有不及格的学生记录 GROUP BY SubjectId -- 按科目分组统计不及格人数 HAVING COUNT(SubjectId) > 20 -- 筛选出不及格人数超过20的科目
逻辑说明
WHERE TotalMarks < 35:先过滤出所有不及格的学生数据,只处理符合条件的行,既符合业务逻辑也提升查询效率GROUP BY SubjectId:将过滤后的记录按科目分组,计算每个组的数量(即对应科目的不及格学生总数)HAVING COUNT(SubjectId) > 20:对分组后的聚合结果做二次筛选,只保留不及格人数超过20的科目
如果存在同一学生多次报考同一科目的情况,需要统计不同学生的话,可以把COUNT(SubjectId)改成COUNT(DISTINCT StudentId),根据你的实际业务场景调整即可。
内容的提问来源于stack exchange,提问作者user3198688
相关产品推荐
相关产品推荐

