写在SQL Server中的TRANSFORM语句(write a TRANSFORM statem

2019-08-06 02:04发布

我从访问MSSQL迁移Web应用程序的后端,但是我没能重现Ø在MSSQL下面的查询,任何想法?

TRANSFORM First(FollowUp.FUData) AS FirstOfFUData
SELECT FollowUp.MRN
FROM FollowUp
GROUP BY FollowUp.MRN
PIVOT FollowUp.FU;

请注意,这个查询从EAV表的数据转换Followup正常表。 这是表的设计Followup

Answer 1:

在SQL Server,你可以使用PIVOT功能和您的查询将被设置是这样的:

select MRN, Value1, Value2
from
(
  select MRN, FUData, FU
  from FollowUp
) src
pivot
(
  max(FUData)
  for FU in (Value1, Value2)
) piv

当您将要替换的Value1Value2等与任何一个值,你的项目,现在应该列。

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)


文章来源: write a TRANSFORM statement in Sql Server