SQL AdventureWorks数据库Employee表PIVOT未返回正确聚合结果问题
问题原因
- PIVOT 会默认将源查询中未出现在聚合函数、FOR子句中的所有字段作为分组依据。你直接使用原表作为PIVOT的源,原表包含除了Gender、SalariedFlag之外的大量字段,哪怕你SELECT只写了YEAR(hiredate),PIVOT阶段还是会按原表所有其他字段分组,最终导致无法按年份聚合,每行独立返回结果。
- SQL Server中
bit类型字段不能直接使用SUM聚合,需要先转换为int类型才能正常计算总和。
修复方案
先通过子查询仅保留查询需要的3个字段:转换为年份的入职时间、性别、转为int类型的SalariedFlag,再基于这个子查询做PIVOT操作,此时PIVOT的分组键就只有年份字段,就能正确按年聚合统计。
正确SQL代码
SELECT [Year] = HireYear, F = ISNULL(F, 0), M = ISNULL(M, 0) FROM ( -- 子查询仅保留需要的字段,避免多余字段参与分组 SELECT HireYear = YEAR(HireDate), Gender, SalariedCount = CAST(SalariedFlag AS INT) FROM HumanResources.Employee ) AS SourceData PIVOT ( SUM(SalariedCount) FOR Gender IN ([F], [M]) ) AS PivotResult
运行后输出和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

