多表数据提取问题:LEFT JOIN未得到预期结果求助
解决LEFT JOIN后聚合结果不符合预期的问题
问题根源
你的SQL语句先执行LEFT JOIN再聚合,当table2中同一个item对应多条记录时,table1的同一条记录会被重复关联,导致sum(cysales)计算的是重复后的值,结果远大于真实总和,这就是不符合预期的核心原因。
修复方案
方案1:先聚合table2再关联
先对table2按item汇总pysales,再和table1做左连接,避免重复关联导致的计算错误:
select t1.item, t1.cymode, sum(t1.cysales) as total_cysales, coalesce(t2.total_pysales, 0) as total_pysales from table1 t1 left join ( -- 先对table2按item聚合,得到每个item的pysales总和 select item, sum(pysales) as total_pysales from table2 group by item ) t2 on t1.item = t2.item group by t1.item, t1.cymode, t2.total_pysales
注:用coalesce可以把NULL转为0,避免结果出现空值
方案2:用窗口函数预计算table2的总和
通过窗口函数在table2中先计算每个item的pysales总和,再关联后取最大值(因为同一item的总和是相同的):
select t1.item, t1.cymode, sum(t1.cysales) as total_cysales, coalesce(max(t2.total_pysales), 0) as total_pysales from table1 t1 left join ( select item, sum(pysales) over(partition by item) as total_pysales from table2 ) t2 on t1.item = t2.item group by t1.item, t1.cymode
验证逻辑
比如table1中某条记录item='A', cymode='X', cysales=10,table2中item='A'有3条pysales分别为5、3、2:
- 原始语句关联后会生成3行
cysales=10,sum(cysales)得到30,错误; - 修复后的语句先计算
table2中item='A'的pysales总和为10,关联后sum(cysales)仍为10,符合预期。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

