繁体   English   中英

SQL Server将多行和两列合并为具有多列的单行

[英]SQL Server multiple rows and two columns into single row with multiple columns

我有一个表,其中包含案例ID,操作和原因列。 一个案例ID可以包含具有不同操作和代码的多行。 我可以旋转并使用列action1,action2,action3等获取多行,但就我的一生而言,无法在单行上获得案例ID,action1,reason1,action2,reason2等。

如果您需要更加动态(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)

退货

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM