在Sql Server中编写TRANSFORM语句

Moh*_*mal 1 t-sql ms-access pivot sql-server-2008

我正在将Web应用程序后端从Access迁移到MSSQL,但是我无法在MSSQL中重现以下Query,任何想法?

TRANSFORM First(FollowUp.FUData) AS FirstOfFUData
SELECT FollowUp.MRN
FROM FollowUp
GROUP BY FollowUp.MRN
PIVOT FollowUp.FU;
Run Code Online (Sandbox Code Playgroud)

请注意,此查询将EAV表Followup中的数据转换为普通表.这是表的设计Followup:

在此输入图像描述

Tar*_*ryn 6

在SQL Server中,您可以使用该PIVOT函数,您的查询将以这种方式设置:

select MRN, Value1, Value2
from
(
  select MRN, FUData, FU
  from FollowUp
) src
pivot
(
  max(FUData)
  for FU in (Value1, Value2)
) piv
Run Code Online (Sandbox Code Playgroud)

当您将要替换的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
Run Code Online (Sandbox Code Playgroud)

如果你有一个已知数量的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)
Run Code Online (Sandbox Code Playgroud)