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

SQL Server中Group By排除Val=0值的最优实现方案问询

解决按指定列分组但保留特定值行的SQL需求

嘿,我来帮你搞定这个需求!先明确下我们的场景:

原始数据

IDValAmount
103
203
304
412
513
623
724

需求目标

对Val列分组计算Amount的总和,但Val=0的记录保持原样不聚合,最终得到如下结果:

ValAmount
03
03
04
15
27

最优解法:用动态分组键实现一次扫描

你提到的UNION方法需要两次扫描数据(一次取Val=0的行,一次分组聚合Val≠0的行),其实我们可以通过设计一个动态分组键,让SQL一次扫描就能完成需求,性能更优:

SELECT 
    Val,
    SUM(Amount) AS Amount
FROM 
    your_table_name
GROUP BY 
    Val,
    CASE WHEN Val = 0 THEN ID ELSE 0 END;

原理说明

  • 当Val=0时,分组键是Val + ID(因为每个ID唯一,所以每个Val=0的行会单独成为一个分组,SUM(Amount)就是它自己的数值)
  • 当Val≠0时,分组键是Val + 0,也就是所有同Val的行会被分到同一组,SUM(Amount)就会计算该组的总和

这样就完美实现了需求,不需要UNION拼接结果集,只需要一次分组聚合操作,效率更高。

验证结果

执行上面的SQL后,得到的结果正好符合你的期望:

  • Val=0的三行各自保留原始Amount值
  • Val=1的两行总和为5,Val=2的两行总和为7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:38