SQL技巧:合并同Name行,分别汇总Bool真假对应的Value值
解决SQL中按Name合并行并汇总Value1/Value2的问题
我来帮你实现将同Name的行合并,把对应条件下的Value分别汇总到Value1和Value2列的需求,这里有两种实用方法:
方法一:条件聚合(推荐,性能更优)
既然Value1和Value2都来自同一张表的同一列,只是过滤条件(Bool的真假)不同,我们可以直接用条件聚合在单次查询中完成计算,不需要拆分两个查询再合并。这种方法只需要扫描一次表,效率更高,还能自动处理某个Name仅在其中一个条件下存在的情况。
SELECT TABLE.Name, SUM(CASE WHEN TABLE.Bool = true THEN TABLE.Value ELSE 0 END) AS VALUE1, SUM(CASE WHEN TABLE.Bool = false THEN TABLE.Value ELSE 0 END) AS VALUE2 FROM TABLE GROUP BY TABLE.Name
如果你的Value列是带前导零的字符串类型(比如示例中的0001),SUM函数无法直接使用,这时候可以改用MAX(因为每个Name在对应条件下只会有一个汇总值):
SELECT TABLE.Name, MAX(CASE WHEN TABLE.Bool = true THEN TABLE.Value ELSE '0' END) AS VALUE1, MAX(CASE WHEN TABLE.Bool = false THEN TABLE.Value ELSE '0000' END) AS VALUE2 FROM TABLE GROUP BY TABLE.Name
方法二:基于原查询结果的二次聚合
如果你必须保留原来两个分组查询的逻辑,也可以先通过UNION ALL合并两个结果集,再对合并后的结果按Name再次分组求和。这里要用UNION ALL而不是UNION,因为UNION会自动去重,而我们需要保留所有行来完成后续的汇总,同时UNION ALL的性能也更好。
SELECT combined.Name, SUM(combined.VALUE1) AS VALUE1, SUM(combined.VALUE2) AS VALUE2 FROM ( -- 第一个查询:Bool=true时的Value汇总 SELECT TABLE.Name, SUM(TABLE.Value) AS VALUE1, 0 AS VALUE2 FROM TABLE WHERE TABLE.Bool = true GROUP BY TABLE.Name UNION ALL -- 第二个查询:Bool=false时的Value汇总 SELECT TABLE.Name, 0 AS VALUE1, SUM(TABLE.Value) AS VALUE2 FROM TABLE WHERE TABLE.Bool = false GROUP BY TABLE.Name ) AS combined GROUP BY combined.Name
这个方法的逻辑是:先分别计算两种条件下每个Name的汇总值,再把这些结果合并后,将同一个Name的两行数据中的Value1和Value2分别相加,最终得到每行对应Name的完整汇总结果。
内容的提问来源于stack exchange,提问作者user3399
相关产品推荐
相关产品推荐

