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

为何使用CAST函数报错,而使用CONVERT函数却无异常?

解决SQL Server的Msg 8120 GROUP BY错误

嘿,这个问题我太熟了!你碰到的是SQL里经典的GROUP BY规则问题,咱们一步步拆解解决。

错误本质

SQL Server严格遵循ANSI SQL的单值规则:当你使用GROUP BY对数据分组时,SELECT列表里的每一列必须满足以下两个条件之一:

  • 是GROUP BY子句里的分组键(也就是你用来分组的列);
  • 被聚合函数(比如SUM()、COUNT()、MIN()、MAX()这类)包裹。

为什么要这么规定?因为分组后,每个分组会被压缩成一行结果。如果某列既不在分组键里,也没被聚合,数据库根本不知道要返回该分组里的哪一个值——毕竟一个分组可能有多条记录,对应多个不同的列值,总不能随便挑一个吧?

你的错误提示里提到的#DiseaseIndex.AdmitDtSrt和#DiseaseIndex.DschrgDtTm,就是既没出现在GROUP BY里,也没被聚合函数处理,所以SQL Server抛出了8120错误。

解决方案

根据你的业务需求,选下面对应的方法就行:

情况1:每个分组里这两列的值是唯一的

如果你的分组键已经能保证每个分组里AdmitDtSrt和DschrgDtTm只有一个值,那直接把这两列加到GROUP BY子句里:

SELECT 
    -- 你的分组列
    PatientID,
    #DiseaseIndex.AdmitDtSrt,
    #DiseaseIndex.DschrgDtTm,
    -- 你的聚合函数
    COUNT(DiseaseID) AS 疾病数量
FROM #DiseaseIndex
GROUP BY PatientID, #DiseaseIndex.AdmitDtSrt, #DiseaseIndex.DschrgDtTm

情况2:每个分组里有多条记录,需要指定返回规则

如果一个分组里有多条记录,你得明确这两列要返回什么值——比如取最早的入院时间、最晚的出院时间,那就用聚合函数包裹它们:

SELECT 
    -- 你的分组列
    PatientID,
    MIN(#DiseaseIndex.AdmitDtSrt) AS 最早入院时间,
    MAX(#DiseaseIndex.DschrgDtTm) AS 最晚出院时间,
    -- 你的聚合函数
    COUNT(DiseaseID) AS 疾病数量
FROM #DiseaseIndex
GROUP BY PatientID

情况3:你其实不需要分组

如果是不小心多加了GROUP BY子句,那直接删掉它就行,错误自然就消失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:59:39