SQL如何按Cliente分组对同一列按不同条件聚合求和
解决方案
针对同列按不同条件分别求和、统一按Cliente分组输出的需求,直接使用条件聚合实现即可,无需拆分4条独立查询再拼接,单次扫描表就能返回全量结果,性能和可维护性都更优。
推荐写法
SELECT Cliente, SUM(CASE WHEN Condição = 0 THEN [Valor Original] ELSE 0 END) AS Emitidos, SUM(CASE WHEN Condição = 1 THEN [Valor Original] ELSE 0 END) AS Baixados, SUM(CASE WHEN Condição = 2 THEN [Valor Original] ELSE 0 END) AS Devolvidos, SUM(CASE WHEN Condição = 3 THEN [Valor Original] ELSE 0 END) AS Outros FROM TAB_Documentos GROUP BY Cliente;
逻辑说明
- 遍历表中每一行时,通过
CASE WHEN判断该行Condição字段的值,匹配对应状态就把该行的[Valor Original]计入对应列的求和,不匹配则计0 - 最终按
Cliente字段分组聚合,每个Cliente对应一行结果,同时展示四个状态的求和值 - 注意你提供的第四条查询存在笔误:
OutrosFROM两个关键字之间缺少空格,编写时需要修正
备选:基于现有4条查询的拼接写法(不推荐)
如果一定要复用你写好的4条独立语句,可以通过全外连接拼接结果集,但这种写法需要多次扫描表,还要额外处理空值避免漏数,代码冗余且性能差,仅做参考:
SELECT COALESCE(e.Cliente, b.Cliente, d.Cliente, o.Cliente) AS Cliente, e.Emitidos, b.Baixados, d.Devolvidos, o.Outros FROM (SELECT Cliente, SUM([Valor Original]) As Emitidos FROM TAB_Documentos WHERE Condição = 0 GROUP BY Cliente) e FULL OUTER JOIN (SELECT Cliente, SUM([Valor Original]) As Baixados FROM TAB_Documentos WHERE Condição = 1 GROUP BY Cliente) b ON e.Cliente = b.Cliente FULL OUTER JOIN (SELECT Cliente, SUM([Valor Original]) As Devolvidos FROM TAB_Documentos WHERE Condição = 2 GROUP BY Cliente) d ON COALESCE(e.Cliente, b.Cliente) = d.Cliente FULL OUTER JOIN (SELECT Cliente, SUM([Valor Original]) As Outros FROM TAB_Documentos WHERE Condição = 3 GROUP BY Cliente) o ON COALESCE(e.Cliente, b.Cliente, d.Cliente) = o.Cliente
代码中用COALESCE和FULL OUTER JOIN处理了某个Cliente没有对应状态记录时的空值和Cliente字段缺失问题,避免结果漏数。
内容的提问来源于stack exchange,提问作者Heitor Badotti
相关产品推荐
相关产品推荐

