【发布时间】:2016-10-17 15:49:59
【问题描述】:
我有一个表格,其中包含案例 ID、操作和原因的列。 单个案例 ID 可以包含具有不同操作和代码的多行。我可以旋转并获取包含 action1、action2、action3 等列的多行,但在我的一生中,无法在一行上获取案例 id、action1、reason1、action2、reason2 等。
【问题讨论】:
标签: sql sql-server pivot
我有一个表格,其中包含案例 ID、操作和原因的列。 单个案例 ID 可以包含具有不同操作和代码的多行。我可以旋转并获取包含 action1、action2、action3 等列的多行,但在我的一生中,无法在一行上获取案例 id、action1、reason1、action2、reason2 等。
【问题讨论】:
标签: sql sql-server pivot
如果您需要更加动态(n 个原因)
Drop Table #Temp
Declare @YourTable table (ID int,Action varchar(50),Reason varchar(50))
Insert Into @YourTable values
(1,'Load Data','Boss said to'),
(1,'Run Query','It is what I do'),
(2,'Take Garbage Out','Wife makes me')
-- Convert Data to EAV Structure'ish
Declare @XML xml = (Select *,GrpSeq = Row_Number() over (Partition By ID Order By (Select NULL)) from @YourTable for XML RAW)
Select ID = r.value('@ID','int')
,ColSeq = Row_Number() over (Partition By r.value('@ID','int') Order By (Select NULL))
,Element = attr.value('local-name(.)','varchar(100)')+r.value('@GrpSeq','varchar(10)')
,Value = attr.value('.','varchar(max)')
Into #Temp
From @XML.nodes('/row') as A(r)
Cross Apply A.r.nodes('./@*') AS B(attr)
Where attr.value('local-name(.)','varchar(100)') not in ('ID','GrpSeq')
-- Get Cols in correct Order
Declare @Cols varchar(max)
Set @Cols = Stuff((Select ',' + QuoteName(Element)
From (Select Distinct Top 100 Percent ColSeq,Element From #Temp Order By ColSeq ) A
For XML Path(''), Type
).value('.', 'varchar(max)'),1,1,'')
-- Execute Dynamic Pivot
Declare @SQL varchar(max) = '
Select *
From (Select ID,Element,Value From #Temp) T
Pivot (
max(Value)
For [Element] in (' + @Cols + ')
) P '
Exec(@SQL)
返回
【讨论】: