如何合并两个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时出现NULLUNION 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
相关产品推荐
相关产品推荐

