SQL Server GROUP BY分组时合并INFO为Heating实现正确聚合
SQL Server INFO类型映射Heating后聚合结果拆分修复方案
问题根因
返回拆分记录、聚合值不对的核心原因有两点:
GROUP BY用了原始表的[Component Type]字段分组,没有和SELECT中定义的类型映射逻辑保持一致,原始值为INFO、Heating的记录即使最终显示为同一个Heating值,也会被判定为不同分组GROUP BY额外加入了[component description]维度,同类型下不同描述的记录会被拆成独立行,无法实现按映射后组件类型+年度的整体聚合
修复后代码
查询输出列的顺序、列名和原语句完全一致,可直接替换原有片段接入外层UNION ALL大查询,无需修改其他关联逻辑:
SELECT CASE WHEN [Component Type] = 'INFO' THEN 'Heating' ELSE [Component Type] END AS [Component Type], COUNT([PLACE-REF]) AS Grand_Total, SUM(TotalCost) AS Grand_Total_Cost, ProgYear FROM ABP_BUILD.dbo.ABP_AssetsComponentCostSummary WHERE Repeating = 1 AND [Component Type] IN ('Heating','INFO') AND [component description] NOT IN ( 'Electric Panel Heaters ', 'Electric Storage Heaters', 'Electric Heating', 'Electric Boiler', 'Gas - Boiler' ) GROUP BY CASE WHEN [Component Type] = 'INFO' THEN 'Heating' ELSE [Component Type] END, ProgYear
代码说明:将原语句两个独立的[component description] NOT IN条件合并为一个,逻辑完全等价,执行效率更高。
效果说明
执行后返回结果完全匹配预期:
- 2029年Heating类型聚合值为Grand_Total=2034、Grand_Total_Cost=5883760,是原拆分的两条记录数值之和
- 2030年Heating类型的聚合结果保持原有数值不变
- 输出结构和原查询完全兼容,不会影响外层UNION ALL的拼接逻辑
如果后续需要同时展示组件描述维度的明细聚合,不要直接在当前查询的GROUP BY中加回
[component description]字段,否则会再次出现拆分问题,需要先通过子查询按类型+年度预聚合得到合计值,再关联明细字段即可。
内容的提问来源于stack exchange,提问作者user3306489
相关产品推荐
相关产品推荐

