如何在T-SQL中让子查询共享主查询条件且保留自身特定条件?
解决方案
你的原查询存在两个问题:一是主查询过滤后会返回多行重复的汇总结果,二是子查询没有正确继承value > 1500的过滤逻辑(实际是全表求和)。以下几种方法可以实现你的需求,且只需要写一次过滤条件:
方法1:条件聚合(最简洁)
直接在主查询中用CASE表达式配合SUM完成分组汇总,过滤条件仅需写一次:
SELECT SUM(CASE WHEN status_FK = 1 THEN [value] ELSE 0 END) AS status1, SUM(CASE WHEN status_FK = 2 THEN [value] ELSE 0 END) AS status2 FROM @table WHERE [value] > 1500;
方法2:CTE预过滤(适合复用过滤数据)
先用CTE筛选出符合value > 1500的数据,再基于CTE做汇总,后续如果有其他计算可以直接复用这个CTE:
WITH FilteredData AS ( SELECT status_FK, [value] FROM @table WHERE [value] > 1500 ) SELECT SUM(CASE WHEN status_FK = 1 THEN [value] ELSE 0 END) AS status1, SUM(CASE WHEN status_FK = 2 THEN [value] ELSE 0 END) AS status2 FROM FilteredData;
方法3:PIVOT(适合多状态列扩展)
如果后续需要增加更多status的汇总列,用PIVOT语法更易扩展:
WITH FilteredData AS ( SELECT status_FK, [value] FROM @table WHERE [value] > 1500 ) SELECT [1] AS status1, [2] AS status2 FROM FilteredData PIVOT ( SUM([value]) FOR status_FK IN ([1], [2]) ) AS PivotTable;
结果说明
以上三种方法都会返回正确的汇总结果:
- status1:所有
status_FK=1且value>1500的记录总和(2000+2000=4000) - status2:所有
status_FK=2且value>1500的记录总和(3000+2000+3000=8000)
内容的提问来源于stack exchange,提问作者Falcoonek
相关产品推荐
相关产品推荐

