SQL报错:无法对含聚合或子查询的表达式执行聚合函数
报错原因
该报错是SQL Server的典型使用限制错误:聚合函数(如你使用的SUM())的计算表达式中,不允许直接嵌套子查询或其他聚合函数。
你修改后的语句把Select MethId from methInfoTbl这个返回结果集的子查询写在了SUM()包裹的CASE WHEN判断里,直接触发了该限制。
实现方案
推荐两种稳定可运行的写法,可根据自己的场景选择:
方案1:LEFT JOIN关联后聚合(性能最优,兼容性最好)
先把两个表通过MethId关联,匹配上的记录就代表属于methInfoTbl的目标Id范围,再做聚合计算即可。如果methInfoTbl中的MethId存在重复值,先对子查询去重避免关联后行数膨胀导致计数不准。SELECT t.MethId, SUM(CASE WHEN m.MethId IS NOT NULL THEN 1 ELSE 0 END) Total, SUM(CASE WHEN t.MethId IN (2,4,6,11,13,14,15,18,21,22,24,28,30,31,56,59,67,68,74,110,182) THEN 1 ELSE 0 END) TotalBottl FROM TblMeth t -- 如果methInfoTbl有重复MethId,替换成LEFT JOIN (SELECT DISTINCT MethId FROM methInfoTbl) m ON t.MethId = m.MethId LEFT JOIN methInfoTbl m ON t.MethId = m.MethId GROUP BY t.MethId方案2:子查询预打标记再聚合(无需处理重复值问题)
先在内层查询逐行判断当前记录的MethId是否存在于methInfoTbl中,生成0/1的标记字段,外层直接对标记字段求和即可,完全避开聚合嵌套子查询的限制,也不会受methInfoTbl重复值影响。SELECT MethId, SUM(is_in_methInfo) Total, SUM(CASE WHEN MethId IN (2,4,6,11,13,14,15,18,21,22,24,28,30,31,56,59,67,68,74,110,182) THEN 1 ELSE 0 END) TotalBottl FROM ( SELECT t.*, CASE WHEN EXISTS (SELECT 1 FROM methInfoTbl m WHERE m.MethId = t.MethId) THEN 1 ELSE 0 END is_in_methInfo FROM TblMeth t ) t GROUP BY MethId
内容的提问来源于stack exchange,提问作者Nate Pet
相关产品推荐
相关产品推荐

