我从访问MSSQL迁移Web应用程序的后端,但是我没能重现Ø在MSSQL下面的查询,任何想法?
TRANSFORM First(FollowUp.FUData) AS FirstOfFUData
SELECT FollowUp.MRN
FROM FollowUp
GROUP BY FollowUp.MRN
PIVOT FollowUp.FU;
请注意,这个查询从EAV表的数据转换Followup
正常表。 这是表的设计Followup
:
我从访问MSSQL迁移Web应用程序的后端,但是我没能重现Ø在MSSQL下面的查询,任何想法?
TRANSFORM First(FollowUp.FUData) AS FirstOfFUData
SELECT FollowUp.MRN
FROM FollowUp
GROUP BY FollowUp.MRN
PIVOT FollowUp.FU;
请注意,这个查询从EAV表的数据转换Followup
正常表。 这是表的设计Followup
:
在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)