【问题标题】:write a TRANSFORM statement in Sql Server在 Sql Server 中编写 TRANSFORM 语句
【发布时间】:2012-12-22 16:42:12
【问题描述】:

我正在将 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

【问题讨论】:

    标签: sql-server-2008 tsql ms-access pivot


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多