不幸的是,如果您想将未知数量的值转换为列,则必须使用动态 SQL。要求在执行查询时知道新列,因此它必须是您正在执行的查询字符串的一部分。
您需要使用类似于以下内容的内容来获取要包含在查询中的列列表:
select @cols = STUFF((SELECT ',' + QUOTENAME(datename(m, monthyear) + ' '
+ cast(year(monthyear) as char(4)))
from yourtable
group by monthyear
order by monthyear
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
然后您生成 PIVOT 结果的完整脚本将是:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(datename(m, monthyear) + ' '
+ cast(year(monthyear) as char(4)))
from yourtable
group by monthyear
order by monthyear
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT empid,' + @cols + '
from
(
select empid,
datename(m, monthyear) + '' ''
+ cast(year(monthyear) as char(4)) monthyear,
hoursworked
from yourtable
) src
pivot
(
sum(hoursworked)
for monthyear in (' + @cols + ')
) p '
execute(@query);
请参阅带有演示的 SQL Fiddle
如果您想将此结果连接到其他表,那么您可以轻松地将 JOIN 包含在动态 SQL 字符串中,或者您可以将结果放入可以连接的临时表中。