将行部分转置为列
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
我仍然需要完全理解它是如何工作的,但它确实有效。我希望它也能帮助到其他人。
问题很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
我仍然需要完全理解它是如何工作的,但它确实有效。我希望它也能帮助到其他人。