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

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;

语句逻辑说明

  1. 两次子查询去重:分别处理order_invoice_id和inv_order_id的关联,避免同一发票/订单对应多条记录
  2. 优先级关联:用COALESCE优先选择order_invoice_id匹配的办公室,符合你期望的结果逻辑
  3. 单发票唯一统计:通过GROUP BY i.inv_id确保每笔发票金额只被计算一次,彻底解决重复求和问题

执行结果

运行该查询后,会得到你预期的结果:

matrahorder_office_id
660.001
1060.002

内容的提问来源于stack exchange,提问作者baturalpdincdari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:31:11