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

多表数据提取问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:44:59