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

如何合并两个SQL查询并生成含差值列的指定6列结果

合并SQL查询以输出指定格式的结果

我明白你想要把两个统计查询合并成一个,输出包含6列的2行数据,其中每行对应一个统计维度,同时计算出剩余大小。下面是具体的解决方案:

符合你需求的2行结果方案

我们可以用CTE(公共表表达式)先分别计算总统计和已完成统计,再通过UNION ALL把两个结果行组合起来,同时补全所有6列:

WITH total_stats AS (
    -- 计算所有数据的总大小和总对象数
    SELECT 
        kunde.nummer AS kunde,
        SUM(datei.groesse) AS GesamtdateiGrosse,
        COUNT(DISTINCT objekt.id) AS anzahlObjGesamt
    FROM datei
    INNER JOIN objekt ON datei.id_objekt = objekt.id
    INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id
    INNER JOIN kunde ON auftrag.id_kunde = kunde.id
    WHERE kunde.nummer = 777
    GROUP BY kunde.nummer
),
completed_stats AS (
    -- 计算状态为"fertig"的已完成数据的大小和对象数
    SELECT 
        kunde.nummer AS kunde,
        SUM(datei.groesse) AS GesamtdateiGrossefertig,
        COUNT(DISTINCT objekt.id) AS anzahlObjFertig
    FROM datei
    INNER JOIN objekt ON datei.id_objekt = objekt.id
    INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id
    INNER JOIN status ON objekt.id_restorestatus = status.id
    INNER JOIN kunde ON auftrag.id_kunde = kunde.id
    WHERE status.name = 'fertig' AND kunde.nummer = 777
    GROUP BY kunde.nummer
)
-- 第一行:展示总统计数据,已完成相关列留空
SELECT 
    ts.kunde,
    ts.GesamtdateiGrosse,
    ts.anzahlObjGesamt,
    NULL AS GesamtdateiGrossefertig,
    NULL AS anzahlObjFertig,
    ts.GesamtdateiGrosse - COALESCE(cs.GesamtdateiGrossefertig, 0) AS RestGross
FROM total_stats ts
LEFT JOIN completed_stats cs ON ts.kunde = cs.kunde

UNION ALL

-- 第二行:展示已完成统计数据,总统计列留空
SELECT 
    cs.kunde,
    NULL AS GesamtdateiGrosse,
    NULL AS anzahlObjGesamt,
    cs.GesamtdateiGrossefertig,
    cs.anzahlObjFertig,
    ts.GesamtdateiGrosse - COALESCE(cs.GesamtdateiGrossefertig, 0) AS RestGross
FROM completed_stats cs
LEFT JOIN total_stats ts ON cs.kunde = ts.kunde;

说明:

  • 用CTE把两个统计逻辑拆分,让代码更清晰易维护
  • COALESCE函数用来处理已完成统计为空的情况(比如没有完成的数据),避免计算RestGross时出现NULL
  • UNION ALL比原查询的UNION效率更高,因为不会去重(这里两个结果行不会重复)

额外推荐:一行展示所有统计数据的方案

如果你之后觉得一行展示所有6列更实用(总统计和已完成统计在同一行),可以用下面的查询,不需要UNION ALL,直接关联两个CTE即可:

WITH total_stats AS (
    SELECT 
        kunde.nummer AS kunde,
        SUM(datei.groesse) AS GesamtdateiGrosse,
        COUNT(DISTINCT objekt.id) AS anzahlObjGesamt
    FROM datei
    INNER JOIN objekt ON datei.id_objekt = objekt.id
    INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id
    INNER JOIN kunde ON auftrag.id_kunde = kunde.id
    WHERE kunde.nummer = 777
    GROUP BY kunde.nummer
),
completed_stats AS (
    SELECT 
        kunde.nummer AS kunde,
        SUM(datei.groesse) AS GesamtdateiGrossefertig,
        COUNT(DISTINCT objekt.id) AS anzahlObjFertig
    FROM datei
    INNER JOIN objekt ON datei.id_objekt = objekt.id
    INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id
    INNER JOIN status ON objekt.id_restorestatus = status.id
    INNER JOIN kunde ON auftrag.id_kunde = kunde.id
    WHERE status.name = 'fertig' AND kunde.nummer = 777
    GROUP BY kunde.nummer
)
SELECT 
    ts.kunde,
    ts.GesamtdateiGrosse,
    ts.anzahlObjGesamt,
    COALESCE(cs.GesamtdateiGrossefertig, 0) AS GesamtdateiGrossefertig,
    COALESCE(cs.anzahlObjFertig, 0) AS anzahlObjFertig,
    ts.GesamtdateiGrosse - COALESCE(cs.GesamtdateiGrossefertig, 0) AS RestGross
FROM total_stats ts
LEFT JOIN completed_stats cs ON ts.kunde = cs.kunde;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:09:48