SQL查询不对HistoryQuantity等数值字段聚合时报GROUP BY错误如何解决
错误原因
你触发报错的核心原因是SELECT子句中存在未聚合的明细计算项:ABS(b.HistoryQuantity - a.TOTFCST) AS 'Abs Error'。SQL的GROUP BY语法规则要求:所有未包裹聚合函数的查询字段,必须全部包含在GROUP BY子句中。你当前分组维度只有LOC、DMDUNIT、DMDPostDate,数据库无法确定同一个分组下有多行数据时,应该取哪一行的HistoryQuantity和TOTFCST计算明细误差,因此抛出错误。
可行解决方案
根据你的实际需求选择对应方案即可:
方案1:需要同时保留明细误差和分组汇总指标
如果你确实需要查看每一行的误差值,同时要对应LOC+DMDUNIT+DMDPostDate维度下的汇总WAPE,用窗口函数替代普通聚合即可,不需要修改GROUP BY逻辑,也不用把数值字段加入分组条件:
-- WAPE (chain) 窗口函数版本 SET ARITHABORT OFF SET ANSI_WARNINGS OFF SELECT b.[LOC], b.[DMDUNIT], b.[DMDPostDate], ABS(b.HistoryQuantity - a.TOTFCST) AS 'Abs Error', SUM(b.HistoryQuantity) OVER(PARTITION BY b.[LOC], b.[DMDUNIT], b.[DMDPostDate]) AS 'Sum of Actuals', SUM(ABS((b.HistoryQuantity - a.TOTFCST))) OVER(PARTITION BY b.[LOC], b.[DMDUNIT], b.[DMDPostDate]) AS 'Sum of Abs Error', SUM(ABS((b.HistoryQuantity - a.TOTFCST))) OVER(PARTITION BY b.[LOC], b.[DMDUNIT], b.[DMDPostDate]) / SUM(b.HistoryQuantity) OVER(PARTITION BY b.[LOC], b.[DMDUNIT], b.[DMDPostDate]) AS 'WAPE' FROM SCPOMGR.FCSTPERFSTATIC a JOIN SCPOMGR.HISTWIDE_CHAIN b ON a.[STARTDATE] = b.[DMDPostDate] AND a.[DMDUNIT] = b.[DMDUNIT] AND a.[LOC] = b.[LOC] ORDER BY b.[LOC]
同分组下的汇总指标会重复出现在该组的每一行数据中,完全符合你的使用要求。
方案2:不需要明细误差,只需要分组汇总的WAPE
如果你是误写了明细误差的字段,只需要维度汇总结果,直接删除SELECT子句中的ABS(b.HistoryQuantity - a.TOTFCST) AS 'Abs Error'行即可,原有GROUP BY逻辑可以正常运行:
-- WAPE (chain) 汇总版本 SET ARITHABORT OFF SET ANSI_WARNINGS OFF SELECT b.[LOC], b.[DMDUNIT], b.[DMDPostDate], SUM(b.HistoryQuantity) AS 'Sum of Actuals', SUM(ABS((b.HistoryQuantity - a.TOTFCST))) AS 'Sum of Abs Error', SUM(ABS((b.HistoryQuantity - a.TOTFCST))) / SUM(b.HistoryQuantity) AS 'WAPE' FROM SCPOMGR.FCSTPERFSTATIC a JOIN SCPOMGR.HISTWIDE_CHAIN b ON a.[STARTDATE] = b.[DMDPostDate] AND a.[DMDUNIT] = b.[DMDUNIT] AND a.[LOC] = b.[LOC] GROUP BY b.[LOC], b.[DMDUNIT], b.[DMDPostDate] ORDER BY b.[LOC]
内容的提问来源于stack exchange,提问作者Davidskis
相关产品推荐
相关产品推荐

