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

SQL多表连接行重复相乘:按CompendiumId求Seats与Slots总和

解决Join两个表时行相乘导致总和错误的问题

我太懂你踩的这个坑了!直接把SAP表和QB表按CompendiumId做Join的话,因为同一个CompendiumId下两边都有多条数据,会触发笛卡尔积——简单说就是两边的行互相匹配,导致行数翻倍,最后求和的时候数值被重复计算,结果自然就不对了。

正确思路:先聚合,再关联

要得到你想要的分组总和,得先分别对两个表按CompendiumId计算出各自的总和,再把这两个聚合后的结果关联起来,这样就不会出现行相乘的问题了。

第一步:分别聚合两个表

先处理SAP表,计算每个CompendiumId的Seats总和:

SELECT CompendiumId, SUM(Seats) AS Seats
FROM SAP
GROUP BY CompendiumId

执行后会得到:

CompendiumIdSeats
443115
57125
35220

再处理QB表,计算每个CompendiumId的Slots总和:

SELECT CompendiumId, SUM(Slots) AS Slots
FROM QB
GROUP BY CompendiumId

执行后会得到:

CompendiumIdSlots
44353
57148

第二步:关联聚合后的结果

用左连接(LEFT JOIN)把两个聚合表关联起来,同时用COALESCE函数把没有对应Slots的项设为0,最终的SQL代码如下:

SELECT
    s.CompendiumId,
    s.Seats,
    COALESCE(q.Slots, 0) AS Slots
FROM (
    -- 先聚合SAP表的Seats总和
    SELECT CompendiumId, SUM(Seats) AS Seats
    FROM SAP
    GROUP BY CompendiumId
) s
LEFT JOIN (
    -- 再聚合QB表的Slots总和
    SELECT CompendiumId, SUM(Slots) AS Slots
    FROM QB
    GROUP BY CompendiumId
) q ON s.CompendiumId = q.CompendiumId
ORDER BY s.CompendiumId;

执行这段代码后,就能得到你期望的结果:

CompendiumIdSeatsSlots
44311553
5712548
352200

为什么直接Join会出错?

举个例子,CompendiumId=443在SAP表有5行,QB表有2行,直接Join后会生成5×2=10行数据。这时候你再求和的话,Seats的总和会变成115×2=230,Slots的总和会变成53×5=265,完全不是你想要的结果——这就是行相乘导致的错误根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:57:01