将行部分转置为列

时间:2015-03-09 16:33:51

标签: sql tsql sql-server-2014

问题非常simple,但我在实现方面遇到了麻烦。

当前表格如下:

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

2 个答案:

答案 0 :(得分:1)

如果值列是已知的\合理设置范围,即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 pivot。有很多堆栈示例显示:

答案 1 :(得分:0)

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

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

我仍然必须完全理解它是如何工作的,但它确实有效。我希望它也可以帮助其他人。