SQL报错Msg 8120求助:无GROUP BY语句却触发聚合规则错误
搞定Msg 8120错误:聚合函数的“隐形分组”要求
Msg 8120, Level 16, State 1, Line 5 列在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。
你说得对,这个错误确实常和GROUP BY绑定,但你没写GROUP BY也中招,问题出在UNION ALL的第二个查询里——只要你在SELECT里用了聚合函数(比如这里的SUM(employment)),SQL就会强制要求:所有非聚合的列,要么放进GROUP BY里,要么也用聚合函数包裹。
你的第二个查询里,year列既没进GROUP BY,也没被聚合函数处理,这就触发了错误。而且你要汇总指定区域的总就业数,其实得明确这个“分组”逻辑才行,哪怕year是固定的'2016'也得遵守规则。
两种简单的修复方式
- 方式一:给
year加GROUP BY:因为所有行的year都是'2016',分组后不会影响汇总结果,完全符合SQL的规则 - 方式二:用聚合函数包裹
year:比如MAX(year)或者MIN(year),结果还是'2016',这样就不用写GROUP BY了
另外,你的区域判断可以用IN简化,代码会清爽很多,不用写一堆OR。
修复后的代码示例
方式一(加GROUP BY):
SELECT year, qtr, area, industry, ownership, employment FROM indstry WHERE area IN ('32001','32005','32007','32009','32011','32013','32015','32017','32019','32021','32023','32027','32033') AND year ='2016' UNION ALL SELECT year, NULL as qtr, '99999' as Area, NULL as industry, NULL as ownership, SUM(employment) as employment FROM industry WHERE area IN ('32001','32005','32007','32009','32011','32013','32015','32017','32019','32021','32023','32027','32033') AND year ='2016' GROUP BY year
方式二(用聚合函数):
SELECT year, qtr, area, industry, ownership, employment FROM indstry WHERE area IN ('32001','32005','32007','32009','32011','32013','32015','32017','32019','32021','32023','32027','32033') AND year ='2016' UNION ALL SELECT MAX(year) as year, NULL as qtr, '99999' as Area, NULL as industry, NULL as ownership, SUM(employment) as employment FROM industry WHERE area IN ('32001','32005','32007','32009','32011','32013','32015','32017','32019','32021','32023','32027','32033') AND year ='2016'
本质上就是满足SQL的规则:只要用了聚合函数,非聚合列必须要么参与分组,要么被聚合处理——哪怕值是固定的,也得走这个流程~
内容的提问来源于stack exchange,提问作者Calflamesfann
相关产品推荐
相关产品推荐

