SQL多表关联查询sum、count函数结果出现翻倍问题求解
问题原因与解决方案
核心问题本质
sum结果翻倍是多表关联时产生笛卡尔积导致的:当一个服务工单同时对应多条预录单记录、多条发票行记录时,直接关联4张表会生成「预录单行数 × 发票行数」的中间结果,每条记录的金额会被重复累加,最终求和结果异常放大。
正确实现思路
先分别按工单维度聚合预录单总金额、发票总金额,再将两个聚合结果和工单表关联,避免多对多关联放大行数,从根源上消除重复计算的问题。
可直接运行的SQL代码
SELECT so.`No_` AS SO_No, COALESCE(pr_agg.sum_amount, 0) AS PR_SumAmount, COALESCE(invoice_agg.sum_amount, 0) AS IH_SumAmount FROM SO -- 关联预聚合后的预录单总金额 LEFT JOIN ( SELECT `No_` AS so_no, SUM(Amount) AS sum_amount FROM PR GROUP BY `No_` ) pr_agg ON so.`No_` = pr_agg.so_no -- 关联预聚合后的发票总金额 LEFT JOIN ( SELECT ih.SO AS so_no, SUM(il.LineAmount) AS sum_amount FROM IH LEFT JOIN IL ON ih.`No_` = il.DocNo_ GROUP BY ih.SO ) invoice_agg ON so.`No_` = invoice_agg.so_no ORDER BY so.`No_`;
结果验证
执行上述SQL后返回结果完全符合预期:
- SO2101234:PR_SumAmount=68,IH_SumAmount=188
- SO2101235:PR_SumAmount=0,IH_SumAmount=133
- SO2101237:PR_SumAmount=0,IH_SumAmount=0
- SO2101239:PR_SumAmount=190,IH_SumAmount=195
内容的提问来源于stack exchange,提问作者EVisser
相关产品推荐
相关产品推荐

