SQL查询报错:已添加GROUP BY仍提示选中的非聚合值必须属于关联分组
问题根因
- 标准SQL的GROUP BY语法要求:所有出现在SELECT子句中的非聚合计算列,必须完整包含在GROUP BY子句中。你当前仅在GROUP BY中声明了第一列
OA.CustNmr,但SELECT子句中还有两个未纳入GROUP BY的非聚合内容:- 自定义计算列
TRIM(COALESCE(A.AcctName,' ') ||' '|| COALESCE(A.Acct2Name,' ') ) AS AcctStyling - 窗口函数PARTITION BY中引用的
A.LocationNR也属于未被分组的列,窗口函数本身不会替代外层GROUP BY的语义约束
- 自定义计算列
- 额外逻辑冲突:你用到的
COUNT(*) OVER()是窗口函数,作用是为每一行返回对应分区的统计值,本身不需要搭配GROUP BY使用,额外添加的GROUP BY反而和窗口函数的语义冲突。
解决思路
可根据你的实际业务需求选择对应方案:
场景1:需要保留所有明细行,仅统计每个(OA.CustNmr, A.LocationNR, AcctStyling)分组的行数
直接删除末尾的GROUP BY 1即可,修改后SQL如下:
SELECT OA.CustNmr ,TRIM(COALESCE(A.AcctName,' ') ||' '|| COALESCE(A.Acct2Name,' ') )AS AcctStyling ,COUNT(*) OVER(PARTITION BY OA.CustNmr, A.LocationNR, AcctStyling) AS CNT_Cust FROM wa.tsn_Open OA JOIN Account1 A ON OA.AcctNr = A.AcctNr WHERE AcctStatCd = 'O' --Open
场景2:确实需要按OA.CustNmr做聚合,每个客户仅返回一行数据
需要把SELECT子句中所有非聚合列要么用聚合函数包裹,要么添加到GROUP BY中:
如果同一个CustNmr对应的AcctStyling、LocationNR都是唯一值,直接扩展GROUP BY即可:
SELECT OA.CustNmr ,TRIM(COALESCE(A.AcctName,' ') ||' '|| COALESCE(A.Acct2Name,' ') )AS AcctStyling ,A.LocationNR ,COUNT(*) AS CNT_Cust FROM wa.tsn_Open OA JOIN Account1 A ON OA.AcctNr = A.AcctNr WHERE AcctStatCd = 'O' --Open GROUP BY OA.CustNmr, AcctStyling, A.LocationNR
如果同一个CustNmr存在多个AcctStyling,可以用MAX/MIN聚合获取其中一个值,例如:
SELECT OA.CustNmr ,MAX(TRIM(COALESCE(A.AcctName,' ') ||' '|| COALESCE(A.Acct2Name,' ') )) AS AcctStyling ,COUNT(*) AS CNT_Cust FROM wa.tsn_Open OA JOIN Account1 A ON OA.AcctNr = A.AcctNr WHERE AcctStatCd = 'O' --Open GROUP BY OA.CustNmr
内容的提问来源于stack exchange,提问作者Sudha
相关产品推荐
相关产品推荐

