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

SQL查询报错:已添加GROUP BY仍提示选中的非聚合值必须属于关联分组

问题根因
  • 标准SQL的GROUP BY语法要求:所有出现在SELECT子句中的非聚合计算列,必须完整包含在GROUP BY子句中。你当前仅在GROUP BY中声明了第一列OA.CustNmr,但SELECT子句中还有两个未纳入GROUP BY的非聚合内容:
    1. 自定义计算列TRIM(COALESCE(A.AcctName,' ') ||' '|| COALESCE(A.Acct2Name,' ') ) AS AcctStyling
    2. 窗口函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:54:05