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

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的科目

逻辑说明

  1. WHERE TotalMarks < 35:先过滤出所有不及格的学生数据,只处理符合条件的行,既符合业务逻辑也提升查询效率
  2. GROUP BY SubjectId:将过滤后的记录按科目分组,计算每个组的数量(即对应科目的不及格学生总数)
  3. HAVING COUNT(SubjectId) > 20:对分组后的聚合结果做二次筛选,只保留不及格人数超过20的科目

如果存在同一学生多次报考同一科目的情况,需要统计不同学生的话,可以把COUNT(SubjectId)改成COUNT(DISTINCT StudentId),根据你的实际业务场景调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:49:05