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

SQL合并两表应用SUM函数分组求和结果偏大问题排查

问题产生原因

你当前关联两张表的逻辑存在笛卡尔积错误:

  • 两张月维度汇总表中,每个Cluster下都存在12条对应2020年1-12月的月度记录
  • 你写的关联条件仅匹配Cluster字段,关联时A表单Cluster下的12条月度记录,会和B表同Cluster下的12条月度记录两两匹配,最终单Cluster生成12*12=144条重复关联结果
  • 后续对这些重复结果做SUM计算时,两边的数值都会被重复累加12倍,最终返回值远高于实际值
  • 你调整后的子查询写法没有修改核心关联逻辑,本质还是仅按Cluster做关联,自然无法解决问题,返回结果和之前完全一致。
修正方法

根据你的需求(按Cluster维度聚合两个表的总数),有两种通用正确写法:

方法1:先单表聚合再关联

先分别把两张表按Cluster维度汇总到单Cluster单条记录,再做关联,从根源避免多对多关联产生的笛卡尔积:

SELECT 
    a.Cluster,
    (a.Posteingang_Anz + b.Posteingang_Bestätigung_Anz) AS Total_Anz,
    (a.Posteingang_Std + b.Posteingang__Bestätigung_Std) AS Total_Std
FROM 
    (
        SELECT 
            Cluster,
            SUM(Posteingang_Anz) AS Posteingang_Anz,
            SUM(Posteingang_Std) AS Posteingang_Std
        FROM DOKU_POSTEINGANG_MONAT
        GROUP BY Cluster
    ) AS a
INNER JOIN 
    (
        SELECT 
            Cluster,
            SUM(Posteingang_Bestätigung_Anz) AS Posteingang_Bestätigung_Anz,
            SUM(Posteingang__Bestätigung_Std) AS Posteingang__Bestätigung_Std
        FROM DOKU_POSTEINGANG_BESTÄTIGUNG_MONAT
        GROUP BY Cluster
    ) AS b 
ON a.Cluster = b.Cluster

方法2:UNION ALL合并后统一聚合

用UNION ALL把两张表的同结构数据合并,再一次性按Cluster分组求和,这种写法还能避免某个Cluster在单表中无数据时,INNER JOIN丢数的问题:

SELECT
    Cluster,
    SUM(Anz) AS Total_Anz,
    SUM(Std) AS Total_Std
FROM (
    SELECT 
        Cluster,
        Posteingang_Anz AS Anz,
        Posteingang_Std AS Std
    FROM DOKU_POSTEINGANG_MONAT
    UNION ALL
    SELECT 
        Cluster,
        Posteingang_Bestätigung_Anz AS Anz,
        Posteingang__Bestätigung_Std AS Std
    FROM DOKU_POSTEINGANG_BESTÄTIGUNG_MONAT
) AS merged
GROUP BY Cluster

补充:如果后续你需要保留月度维度做关联汇总,关联条件必须同时匹配Cluster和Monat两个字段,即ON a.Cluster = b.Cluster AND a.Monat = b.Monat,否则依然会出现笛卡尔积导致数值虚高的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:15:34