SQL Pivot表未返回预期结果,请求排查解决
问题排查与解决方案
核心问题
- 月份名称不匹配:原查询用
datename(month, b.dDateCreated)返回的是完整英文月份名(如January、February),但Pivot子句里写的是月份缩写([Jan]、[Feb]),两者无法关联,只有May因完整名和缩写一致能正常统计,其他月份都返回0。 - 日期字段逻辑错误:需求是统计患者新增时间,但原查询用的是分支机构的创建日期
b.dDateCreated,而非患者表的新增日期,这会导致统计逻辑完全偏离需求。
修正后的查询
select * from ( -- 获取月份3位英文缩写,确保和Pivot列名匹配 select left(datename(month, p.dDateCreated), 3) as [Month], b.sName as BranchName, datename(year, p.dDateCreated) as [Year], p.ipkPatientID from Branch b inner join Patients p on p.ifkBranchID = b.ipkBranchID -- 筛选患者新增日期范围,而非分支机构创建日期 where p.dDateCreated between '2020-01-01' and '2021-12-31 23:59:59.999' ) as Src pivot( count(ipkPatientID) -- 修正Sept为Sep,匹配left(datename)的返回结果 for [Month] in ([Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec]) ) as Pivot_Table order by Year, BranchName;
关键修正说明
- 月份格式统一:用
left(datename(month, ...), 3)生成3位月份缩写,和Pivot子句中的列名完全对应;也可改用format(p.dDateCreated, 'MMM', 'en-US')更精准生成缩写。 - 统计逻辑修正:替换日期字段为患者表的
p.dDateCreated,确保统计的是患者新增时间对应的月份数据。 - 修正月份缩写:将原Pivot中的
[Sept]改为[Sep],匹配SQL Server返回的九月缩写格式。
验证步骤
- 单独执行子查询
Src部分,确认[Month]列的值为Jan/Feb等3位缩写,且各月份均有数据。 - 执行完整透视查询,检查各分支机构、各年份的月度统计结果是否与源数据一致。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

