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
相关产品推荐
相关产品推荐

