我正在将一个web应用程序后端从Access迁移到MSSQL,但是我无法在MSSQL中重现以下查询,你有什么想法吗?
TRANSFORM First(FollowUp.FUData) AS FirstOfFUData
SELECT FollowUp.MRN
FROM FollowUp
GROUP BY FollowUp.MRN
PIVOT FollowUp.FU;
请注意,此查询将EAV表Followup
中的数据转换为普通表。这是表Followup
的设计
发布于 2013-01-09 02:29:59
在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 Server2008没有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
如果您有一个已知数量的SQL值要转换为列,那么上面的版本将非常有效,但是如果您没有这样做,那么您将需要使用如下所示的动态FU
:
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)
https://stackoverflow.com/questions/14221593
复制相似问题