SQL分组筛选多条判决罪犯记录 聚合函数位置报错解决

错误原因
你的查询触发报错、结果不符合预期,是违反了SQL基础语法/逻辑规则:
- 聚合函数(如
count()、sum()等分组统计函数)不能直接写在WHERE子句中。WHERE的执行优先级在分组操作之前,作用是逐行过滤原始数据,执行阶段还未生成分组统计值,根本无法判断聚合结果是否满足条件。对聚合结果的过滤必须使用HAVING子句,该子句会在分组统计完成后对分组结果做筛选,这也是报错提示直接指出的核心问题。 - 分组字段不完整。你在
SELECT中查询了criminals.last、sentences.criminal_id两个非聚合字段,但GROUP BY仅写了criminals.last。在标准SQL模式下,所有非聚合的查询字段必须全部加入分组规则,否则会出现统计逻辑错误——比如存在两名同姓的不同罪犯时,仅按姓氏分组会把两人的判决记录混算在一起。 - 排序逻辑无效。你在
ORDER BY后写的'Number of Sentences'是带单引号的字符串常量,不是你定义的统计字段别名,执行时不会按判决数排序,只会按固定常量做无意义排序。 - 字段遗漏:需求要求返回罪犯的名字(first name),原查询未查询该字段。
修正后可直接运行的查询语句
SELECT c.criminal_id, c.first AS first_name, c.last AS last_name, COUNT(s.sentence_id) AS `Number of Sentences` FROM criminals c INNER JOIN sentences s ON c.criminal_id = s.criminal_id GROUP BY c.criminal_id, c.first, c.last HAVING COUNT(s.sentence_id) > 1 ORDER BY `Number of Sentences` DESC;
关键逻辑说明
- 给两张表起了短别名简化语句,提升可读性
- 以
criminal_id作为核心分组字段,该字段是罪犯表的主键,全局唯一,从根源上避免同名同姓导致的统计错误 - 聚合值判断移至
HAVING子句,符合SQL执行顺序逻辑 - 用反引号包裹统计字段别名做排序,保证排序按判决数倒序生效
- 内连接(INNER JOIN)会自动过滤掉没有任何判决记录的罪犯,无需额外添加判空条件
内容的提问来源于stack exchange,提问作者dheeke
相关产品推荐
相关产品推荐

