使用AVG、MAX聚合函数分组查询仍返回重复结果问题排查
问题原因与解决方案
核心错误点
- 错误1:
GROUP BY包含了非维度字段。你需要按销售订单唯一分组,仅需将和销售订单一一对应的维度字段放入分组规则即可,你额外加入了t3.Export_Date、t4.volume_discount两个字段,会导致每个不同的日期、不同的返利值都生成独立分组,自然同一个销售订单会出现多行结果。 - 错误2:聚合函数的冗余写法。
(SELECT MAX(t3.Export_Date))这类标量子查询完全没必要嵌套,直接写聚合函数即可;而且受错误分组规则的影响,你写的MAX实际上是取当前分组(单条日期)的最大值,相当于没有做聚合计算,AVG同理也是取当前分组(单条返利值)的平均值,完全没有达到计算全订单平均值的效果。 - 额外说明:你用
DISTINCT无效的原因是,重复订单对应的行至少有Last Date或Rebate AVG一个字段值不同,DISTINCT是对整行内容去重,自然无法合并这些行。
修正后的SQL写法
仅需要修改SELECT部分的聚合函数写法、调整GROUP BY的字段即可,你的FROM、WHERE逻辑可以完全保留:
SELECT t1.Name AS [Sales Order No.] , t2.name AS [Account Name] , MAX(t3.Export_Date) AS [Last Date] , AVG(t4.volume_discount) AS [Rebate AVG] -- 以下保留你原有的多表关联、筛选条件 FROM 【你的原FROM多表关联逻辑】 WHERE 【你的原WHERE筛选条件】 -- 仅保留两个和销售订单一一对应的维度字段分组 GROUP BY t1.Name, t2.name
效果说明
修正后,同一个销售订单的所有关联数据会被合并为一行:
MAX(t3.Export_Date)会自动取该订单下所有关联日期的最大值,即你需要的最新日期AVG(t4.volume_discount)会自动计算该订单下所有返利值的平均值- 最终每个销售订单仅返回唯一一条结果,符合需求。
内容的提问来源于stack exchange,提问作者phiphil
相关产品推荐
相关产品推荐

