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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:17:18