SQL查询中SUM、GROUP BY与LEFT JOIN导致金额重复求和问题求助
解决SQL中金额重复计算的问题
你的问题出在LEFT JOIN使用了OR连接条件,这会让单个发票和多个订单建立关联,产生笛卡尔积——比如发票inv_id=2会匹配order2和order3,导致320元被计算两次;inv_id=3会匹配order3和order4,740元也被计算两次,最终总和自然不符合预期。
要解决这个问题,核心是确保每笔发票只被归属到一个办公室一次,同时匹配你期望的业务逻辑(从结果来看,优先通过order_invoice_id关联发票和订单,再通过inv_order_id)。下面是具体的解决方案:
正确的查询语句
SELECT SUM(inv_amount) AS matrah, order_office_id FROM ( SELECT i.inv_amount, -- 优先取order_invoice_id匹配的办公室,无匹配则取inv_order_id关联的办公室 COALESCE(o1.order_office_id, o2.order_office_id) AS order_office_id FROM invoices i -- 先关联order_invoice_id,去重避免同一发票对应多个订单时重复关联 LEFT JOIN ( SELECT DISTINCT order_invoice_id, order_office_id FROM orders ) o1 ON i.inv_id = o1.order_invoice_id -- 再关联inv_order_id,同样去重确保单订单对应单办公室 LEFT JOIN ( SELECT DISTINCT order_id, order_office_id FROM orders ) o2 ON i.inv_order_id = o2.order_id -- 过滤掉无对应办公室的发票 WHERE COALESCE(o1.order_office_id, o2.order_office_id) IS NOT NULL -- 确保每笔发票仅被统计一次 GROUP BY i.inv_id, i.inv_amount, COALESCE(o1.order_office_id, o2.order_office_id) ) AS invoice_office GROUP BY order_office_id;
语句逻辑说明
- 两次子查询去重:分别处理
order_invoice_id和inv_order_id的关联,避免同一发票/订单对应多条记录 - 优先级关联:用
COALESCE优先选择order_invoice_id匹配的办公室,符合你期望的结果逻辑 - 单发票唯一统计:通过
GROUP BY i.inv_id确保每笔发票金额只被计算一次,彻底解决重复求和问题
执行结果
运行该查询后,会得到你预期的结果:
| matrah | order_office_id |
|---|---|
| 660.00 | 1 |
| 1060.00 | 2 |
内容的提问来源于stack exchange,提问作者baturalpdincdari
相关产品推荐
相关产品推荐

