转置和创建变量

时间:2018-12-10 18:17:19

标签: sql-server transpose

我的数据如下:

PT_ID   Time        HR       RR      SysBP
   1     830        120      24    
   1     900        124               118
   1    1000                          115
   1    1045        118      20    

ETC。

所需的输出:

 PT_ID   Time1  HR1   RR1   SysBP1   Time2   HR2   RR2   SysBp2   Time3   Etc
   1      830    24                   900    124          118      1000

这种类型的操作对于我的SQL新手来说太棘手了,如果您都知道一个潜在的解决方案,我会很好奇。

1 个答案:

答案 0 :(得分:3)

如果您有一个已知的或最大数量的观测值,则可以将PIVOT与Row_Number()配合使用(假设TIME是正确的序列)

如果未知的观测值/列数,则必须使用一些动态SQL。

示例

Select *
 From  (
        Select A.[PT_ID] 
              ,B.*
         From  (Select *,RN=Row_Number() over (Partition By PT_ID Order by Time) From YourTable ) A
         Cross Apply (values (concat('Time' ,RN),[Time])
                            ,(concat('HR'   ,RN),[HR])
                            ,(concat('RR'   ,RN),[RR])
                            ,(concat('SysBP',RN),[SysBP])
                     ) B(Item,Value)
       ) src
 Pivot (sum(Value) for Item in  ([Time1],[HR1],[RR1],[SysBP1]
                                ,[Time2],[HR2],[RR2],[SysBP2]
                                ,[Time3],[HR3],[RR3],[SysBP3]
                                ,[Time4],[HR4],[RR4],[SysBP4]
                                ) ) pvt

返回

enter image description here

我不小心编辑了此帖子,但并不意味着删除了该编辑。