2016-10-17 9 views
0

사례 ID, 동작 및 이유에 대한 열이있는 테이블이 있습니다. 하나의 케이스 ID는 여러 액션과 코드를 가진 여러 행을 가질 수 있습니다. 피할 수 있고 여러 행을 action1, action2, action3 등의 열로 가져올 수 있지만 내 인생에서 case ID, action1, reason1, action2, reason2 등을 한 행에 가져올 수 없습니다.SQL Server 다중 행과 여러 열이있는 단일 행의 두 열

+0

가능한 중복 : https://stackoverflow.com/questions/2170058/can- SQL Server- 피벗 - 알지 못하는 - 결과 - 열 이름 – openshac

답변

0

당신이 좀 더 동적 (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) 

반환을 이동해야하는 경우

enter image description here

관련 문제