在 SQL Server 中,您可以使用 PIVOT 函数,您的查询将这样设置:
select MRN, Value1, Value2
from
(
select MRN, FUData, FU
from FollowUp
) src
pivot
(
max(FUData)
for FU in (Value1, Value2)
) piv
您可以将 Value1、Value2 等替换为您现在应该是列的任何值。
SQL Server 2008 没有 FIRST() 函数,因此您必须使用另一个聚合函数或以这样的方式查询数据,以返回 FU 中每个项目的第一条记录。
另一种编写方式是使用带有CASE 语句的聚合函数:
select MRN,
max(case when FU = 'value1' then FUData else null end) Value1,
max(case when FU = 'value2' then FUData else null end) Value2
from FollowUp
group by MRN
如果您将已知数量的FU 值转换为列,则上述版本将非常有用,但如果您没有,则需要使用类似于此的动态 SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(FU)
from FollowUp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT MRN,' + @cols + ' from
(
select MRN, FUData, FU
from FollowUp
) x
pivot
(
max(FUData)
for FU in (' + @cols + ')
) p '
execute(@query)