将行部分转置为列

Partial transpose of rows to columns

问题很simple,但是实现起来有点困难

当前的 table 看起来像这样:

ID  Value

A   1
A   2
A   3
B   1
B   2
C   1

我需要这样的:

ID Value1 Value2 Value3 Value...
A   1      2      3      NULL
B   1      2      NULL   NULL
C   1     NULL    NULL   NULL

如果值列是 known\reasonable 设置范围,即 1-5,您可以执行如下操作:

Select ID, 
    MAX(CASE WHEN Value = 1 Then 1 Else Null End) as Value1,
    MAX(CASE WHEN Value = 2 Then 2 Else Null End) as Value2,
    MAX(CASE WHEN Value = 3 Then 3 Else Null End) as Value3,
    MAX(CASE WHEN Value = 4 Then 4 Else Null End) as Value4,
    MAX(CASE WHEN Value = 5 Then 5 Else Null End) as Value5
From Table
Group By ID

如果您一开始不知道列数,即它们是动态的,那么您将不得不编写一个动态 sql 主元。有很多堆栈示例显示了这一点:

  • this one
  • or this one
  • and this one

好的,在你的帮助下,在朋友的帮助下,我这样解决了这个问题。

Select ROW_NUMBER() 
        OVER (PARTITION BY Field1 
        ORDER BY Field1) 
        AS order_num, Field1, Value
into #tab1
from Source_Table
Order by Field1


Select * 
from #tab1
    PIVOT
        (Max(Value)  
            FOR order_num IN ([1], [2], [3], [4], [5])) AS PVT


drop table #tab1

我仍然需要完全理解它是如何工作的,但它确实有效。我希望它也能帮助到其他人。