2016-12-08 7 views
1

다양한 ID 열 값을 사용하여 다른 수의 행을 동적으로 생성하는 쿼리가 있습니다. 나는이 결과를 원주 형 결과로 옮길 수 있어야한다. 내 현재 데이터 결과는 다음과 같습니다.T-SQL에서 여러 열을 피벗하려고합니다.

ID Caption FieldName  FieldType 
--- --------- ------------ ------------ 
10 Caption 1 Field Name 1 Field Type 1 
11 Caption 2 Field Name 2 Field Type 2 
12 Caption 3 Field Name 3 Field Type 3 
20 Caption 4 Field Name 4 Field Type 4 
30 Caption 5 Field Name 5 Field Type 5 

내 원하는 결과는

10   11   12   20   30 
--------  ---------- ---------  ---------  --------- 
Caption 1  Caption 2  Caption 3  Caption 4  Caption 5 
Field Name 1 Field Name 2 Field Name 3 Field Name 4 Field Name 5 
Field Type 1 Field Type 2 Field Type 3 Field Type 4 Field Type 5 

값이 10, 11, 12, 20, 30 뭔가 다른 것으로 변경할 수 있습니다, 그래서 내가 몇 가지 동적 SQL을 할 필요가 있음을 양해 해 주시기 바랍니다 . 가능한 경우 CURSORS 사용을 피하고 싶습니다.

모든 의견을 환영합니다. 당신이가는 괜찮다면 포맷을

+1

당신은 당신이 이미 게시물에 시도 코드를 포함하지 않는 이유는 일부 동적 SQL을 수행 할 필요가 이해한다면 ? – dfundako

+0

나는 단지 내가해야 할 일을 이해하기 위해 다른 포스트를 보았지만 여기에 코드를 붙여 넣을 방법이 확실치 않습니다. @는 코드 붙여 넣기를 할 때 약간의 오류가 발생합니다 .. – gsva

+0

이 것이 PIVOT이라면 나는 확신 할 수 없습니다. 테이블을 조 변경하려고하는 것 같습니다. – DVT

답변

0

2005 버전

Declare @SQL varchar(max) 
Select @SQL = stuff((Select Distinct ',' + QuoteName(ID)+'=max(case when Item='+cast(ID as varchar(25))+' then Value else null end)' From YourTable Order By 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Seq],'[email protected] +' 
From (
     Select Item=A.ID,B.* 
     From YourTable A 
     Cross Apply ( 
         Select Seq=1,Value=cast(A.Caption as varchar(max)) Union All 
         Select Seq=2,Value=cast(A.FieldName as varchar(max)) Union All 
         Select Seq=3,Value=cast(A.FieldType as varchar(max)) 
        ) B 
     ) A 
Group By Seq 
Order By Seq 
' 
Exec(@SQL); 

반환

enter image description here

0

서하십시오 동적

내가 SEQ (결과의 첫 번째 열)을 제거 주저입니다. 최종 쿼리에서 [SEQ],을 제거 할 수 있지만 더 큰 데이터 세트에서 올바른 시퀀스를 유지할 수 있는지 확신 할 수 없습니다.

Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct ',' + QuoteName(ID) From YourTable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Seq],' + @SQL + ' 
    From (
     Select Item=A.ID,B.* 
     From YourTable A 
     Cross Apply (
         Select Seq=1,Value=cast(A.Caption as varchar(max)) Union All 
         Select Seq=2,Value=cast(A.FieldName as varchar(max)) Union All 
         Select Seq=3,Value=cast(A.FieldType as varchar(max)) 
        ) B 
     ) A 
Pivot (max(value) For Item in (' + @SQL + ')) p' 
Exec(@SQL); 

반환

enter image description here

편집 - 최종에서 제거 서열로 선택

enter image description here

+0

결과는 내가 원하지만 위의 코드를 사용하는 동안 구문 오류가 발생합니다. 그건 나에게 구문 오류가 새 값을 제공합니다 – gsva

+0

그것은 다릅니다. 페이지에 표시되는 필드 목록을 얻고 있습니다. 나는 일반적인 스크립트를 만들려고 노력 중이므로이 스크립트를 엑셀로 내보낼 수있는 형식으로 출력합니다. 이 엑셀 시트는 자동화 테스트를위한 데이터로 채워질 수 있습니다. 이 필드의 수는 10-60까지 다양 할 수 있습니다. – gsva

+0

위에서 피벗을 위해 나열한 출력을 생성하기 전에 특정 조건을 기반으로 일부 필드를 추가하거나 제거하여 많은 조작을 수행합니다. 따라서 ID 열이 일관되게 일치하지 않을 수 있습니다. 페이지 사이의 값이 같습니다. – gsva