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

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

Tables:Sentences and Criminals

错误原因

你的查询触发报错、结果不符合预期,是违反了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:57:23