为何使用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
相关产品推荐
相关产品推荐

