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

Transact SQL技术问询:能否改写代码避免GROUP BY实现SUM()?

如何改写TSQL查询避免使用GROUP BY?

当然可以啦!咱们可以用窗口函数结合DISTINCT来替代GROUP BY,实现和原查询完全一致的结果,具体思路和改写后的代码如下:

核心思路

原查询是按GLRegion、GLRegionWHID等多个维度分组,对满足雇佣/离职日期条件的员工计数求和。要避开GROUP BY,可以用窗口函数的PARTITION BY子句指定原分组的所有列,计算每组的总和;再通过DISTINCT去除重复行(因为窗口函数会给每组的每一行都返回相同的总和值),最终得到和GROUP BY相同的聚合结果。

改写后的完整代码

DECLARE @MonthBOP date = '07-01-2017'
DECLARE @MonthEOP date = '02-28-2018'
DECLARE @GLRegionsWHID int = -1

SELECT DISTINCT
    e.[GLRegion],
    e.[GLRegionWHID],
    e.[GLProgram],
    e.[GLProgramWHID],
    e.[DOLStatus],
    e.[DOLStatusWHID],
    e.[TerminationType],
    e.[TerminationReason],
    SUM(IIF((e.[DateHired] <= @MonthBOP) AND (e.[DateTerminated] >= @MonthBOP), 1, 0)) 
        OVER (PARTITION BY 
              e.[GLRegion], 
              e.[GLRegionWHID], 
              e.[GLProgram], 
              e.[GLProgramWHID], 
              e.[DOLStatus], 
              e.[DOLStatusWHID], 
              e.[TerminationType], 
              e.[TerminationReason]
             ) AS [CountEmployee]
-- 记得替换成你实际使用的表名
FROM YourTableName e
-- 原查询如果有WHERE条件,比如和@GLRegionsWHID相关的过滤,记得补上
WHERE e.[GLRegionWHID] = @GLRegionsWHID

注意事项

  • 请把代码中的YourTableName替换成你实际操作的表名,同时补充原查询中缺失的FROM和WHERE子句
  • 这个改写版本和原GROUP BY查询的输出结果完全一致,因为PARTITION BY的列和原分组列完全对应,SUM() OVER()计算的就是每个分组的员工计数
  • 这种方式在需要保留行级数据同时计算分组统计值的场景下,会比GROUP BY更灵活

内容的提问来源于stack exchange,提问作者Hell-1931

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:23:56