Tsql 如何在多达49个字段上旋转?

Tsql 如何在多达49个字段上旋转?,tsql,sql-server-2005,Tsql,Sql Server 2005,我有一个包含过程数据的表。对于给定的遭遇,最多可以有49个条目。我想为每个帐户输出一行,包括过程、日期和提供者。为此,我尝试过撰写案例陈述: Select DISTINCT [Encounter Number], CASE When [Encounter Proc Sequence] = '1' Then [Procedure Code (Enctr)] END as 'Proc1', Case When [Encounter Proc Sequence] = '1' Then [Date

我有一个包含过程数据的表。对于给定的遭遇,最多可以有49个条目。我想为每个帐户输出一行,包括过程、日期和提供者。为此,我尝试过撰写案例陈述:

Select DISTINCT [Encounter Number], 
CASE When [Encounter Proc Sequence] = '1' Then [Procedure Code (Enctr)] 
END as 'Proc1',
Case When [Encounter Proc Sequence] = '1' Then [Date of Service]
END as 'SvcDate1',
CASE When [Encounter Proc Sequence] = '1' Then [Surgeon]
END as 'Surgeon1',
CASE When [Encounter Proc Sequence] = '2' Then [Procedure Code (Enctr)] 
END as 'Proc2',
Case When [Encounter Proc Sequence] = '2' Then [Date of Service]
END as 'SvcDate2',
CASE When [Encounter Proc Sequence] = '2' Then [Surgeon]
END as 'Surgeon2',
CASE When [Encounter Proc Sequence] = '3' Then [Procedure Code (Enctr)] 
END as 'Proc3',
Case When [Encounter Proc Sequence] = '3' Then [Date of Service]
END as 'SvcDate3',
CASE When [Encounter Proc Sequence] = '3' Then [Surgeon]
END as 'Surgeon3',
CASE When [Encounter Proc Sequence] = '4' Then [Procedure Code (Enctr)] 
END as 'Proc4',
Case When [Encounter Proc Sequence] = '4' Then [Date of Service]
END as 'SvcDate4',
CASE When [Encounter Proc Sequence] = '4' Then [Surgeon]
END as 'Surgeon4',
CASE When [Encounter Proc Sequence] = '5' Then [Procedure Code (Enctr)] 
END as 'Proc5',
Case When [Encounter Proc Sequence] = '5' Then [Date of Service]
END as 'SvcDate5',
CASE When [Encounter Proc Sequence] = '5' Then [Surgeon]
END as 'Surgeon5',
CASE When [Encounter Proc Sequence] = '6' Then [Procedure Code (Enctr)] 
END as 'Proc6',
Case When [Encounter Proc Sequence] = '6' Then [Date of Service]
END as 'SvcDate6',
CASE When [Encounter Proc Sequence] = '6' Then [Surgeon]
END as 'Surgeon6',
CASE When [Encounter Proc Sequence] = '7' Then [Procedure Code (Enctr)] 
END as 'Proc7',
Case When [Encounter Proc Sequence] = '7' Then [Date of Service]
END as 'SvcDate7',
CASE When [Encounter Proc Sequence] = '7' Then [Surgeon]
END as 'Surgeon7'
from EncounterProc
where [Date of Service] between '20090101' and '20091231'
and [Procedure Code (ENCTR)] is not null
Group by [Encounter Number], [Encounter Proc Sequence],[Procedure Code (ENCTR)], [Date of     
Service], Surgeon
查询输出显示一些重复的行,并且查询没有将过程3(例如)放在Proc3列中。
如何设置此场景的PIVOT语法

更新: 我已经阅读了有关PIVOT的MSDN库文档,以及评论中共享的链接。我尝试根据我的需要调整这些来源,如下所示:

Select [Encounter Number],
[1] as Proc1,
[Date1] as SvcDate1,
[MD1] as MD1,
[2] as Proc2,
[Date2] as SvcDate2,
[MD2] as MD2,
[3] as Proc3,
[Date3] as SvcDate3,
[MD3] as MD3,
[4] as Proc4,
[Date4] as SvcDate4,
[MD4] as MD4
From
(Select * From
(SELECT [Encounter Number]
        ,[Procedure Code (Enctr)]
        ,Row_Number() OVER ( Partition By [Encounter Number] Order By 
                    [Encounter Number], [Procedure Code (Enctr)] ) AS RowNumber
        FROM EncounterProc)
PIVOT ( MAX([Procedure Code (Enctr)] ) for RowNumber IN 
( [1], [Date1], [MD1],[2], [Date2], [MD2], [3], [Date3], [MD3], [4], [Date4],   
      [MD4]))
当我运行此查询时,SSMS会显示以下错误:

Incorrect syntax near the keyword 'PIVOT'.
更新2:根据斯图尔特的评论,我将查询修改为:

Select [Encounter Number],
p.[1] as Proc1,
p.[Date1] as SvcDate1,
p.[MD1] as MD1,
p.[2] as Proc2,
p.[Date2] as SvcDate2,
p.[MD2] as MD2,
p.[3] as Proc3,
p.[Date3] as SvcDate3,
p.[MD3] as MD3,
p.[4] as Proc4,
p.[Date4] as SvcDate4,
p.[MD4] as MD4
From
(Select * From
(SELECT [Encounter Number]
        ,[Procedure Code (Enctr)] 
        ,[Date of Service]
        ,[Surgeon]
        ,Row_Number() OVER ( Partition By [Encounter Number] Order By   
                     [Encounter Number], [Encounter Proc Sequence] ) AS RowNumber
        FROM EncounterProc) p
PIVOT ( MAX([Procedure Code (Enctr)] ) for RowNumber IN 
( [1], [Date1], [MD1],[2], [Date2], [MD2], [3], [Date3], [MD3], [4], [Date4], 
    [MD4]) )
我现在收到一个新的错误,说明:

Msg 102, Level 15, State 1, Line 23
Incorrect syntax near ')'.
它指向PIVOT语句的右括号


必须做什么来修复语法错误

您的第一个查询是最接近的查询,只是您没有将每个
案例
都包含在aggreagate函数中。此外,您似乎不需要在
group by
子句中使用某些列:

select
    [Encounter Number], 
    Proc1 = max(CASE When [Encounter Proc Sequence] = '1' Then [Procedure Code (Enctr)] END),
    SvcDate1 = max(Case When [Encounter Proc Sequence] = '1' Then [Date of Service] END),
    Surgeon1 = max(CASE When [Encounter Proc Sequence] = '1' Then [Surgeon] END),
    Proc2 = max(CASE When [Encounter Proc Sequence] = '2' Then [Procedure Code (Enctr)] END),
    SvcDate2 = max(Case When [Encounter Proc Sequence] = '2' Then [Date of Service] END),
    Surgeon2 = max(CASE When [Encounter Proc Sequence] = '2' Then [Surgeon] END),
    Proc3 = max(CASE When [Encounter Proc Sequence] = '3' Then [Procedure Code (Enctr)] END),
    SvcDate3 = max(Case When [Encounter Proc Sequence] = '3' Then [Date of Service] END),
    Surgeon3 = max(CASE When [Encounter Proc Sequence] = '3' Then [Surgeon] END)
    --- etc.
from EncounterProc
where [Date of Service] between '20090101' and '20091231'
    and [Procedure Code (ENCTR)] is not null
group by [Encounter Number], [Encounter Proc Sequence]

我相信这个例子更适合这个案例。。。END语法比PIVOT语法更有效。为了执行数据透视,首先需要将数据再折叠一次,这看起来不必要地复杂。当使用
大小写
分组方式
进行数据透视时,通常使用
max
min
。请参见示例()。在使用PIVOT命令之前,需要子查询的表别名;e、 g.选择*从(选择…)p轴。。。