TSQL

2012-11-01 2 views
1

에 열을 행을 피벗 I가 다음 샘플 데이터TSQL

ID Language  Question  SubQuestion  SubSubQuestion TotalCount TotalPercent 
3  E    9    0    1    88527   73% 
3  E    9    0    2    19684   16% 
3  E    9    0    3    12960   11% 
3  E    9    0    9    933    1% 

나는 모든 내가 피벗 명령을 사용하여 피곤했습니다이

ID Language  TotalCount901 TotalPercent901  TotalCount902 TotalPercent902 TotalCount903 TotalPercent903 
    3  E   88527   73%     19684    16%    12960    11% 

같은 하나의 행에서 원하는 다음과 같은 테이블, 하지만 그것은 나를 위해 일할 dosnt.

+1

참조, 바람직하지 않은 결과를 제공 , 다른 것? – LittleBobbyTables

+1

테스트 피들 : http://www.sqlfiddle.com/#!3/3a3fc/1 – mellamokb

+0

그룹화 기준이란 무엇입니까? 하위/하위 질문의 수가 동적입니까? 동적으로 생성 된 SQL 코드를 사용해야하므로 동적 열 수를 사용하여 피벗하기가 어렵습니다. 피벗을 수행 할 수있는 결과를 표시하기 위해 응용 프로그램 언어를 사용하고 있습니까? 일반적으로 동적 열 너비 시나리오의 경우 더 쉽습니다. – mellamokb

답변

2

열 이름을 기반으로 몇 가지 가정을했지만, 이와 비슷한 것을 사용하려는 것 같습니다. 이것은 당신이 요청한 열의 값을 얻기 위해 다음 둘 모두 UNPIVOTPIVOT을 적용

select * 
from 
(
    select id, 
    language, 
    col + cast(QUESTION as varchar(10)) 
     +cast(subquestion as varchar(10)) 
     +cast(SubSubQuestion as varchar(10)) col, 
    value 
    from 
    (
    select id, language, 
     cast(TotalCount as varchar(10)) TotalCount, 
     totalPercent, 
     question, subquestion, SubSubQuestion 
    from yourtable 
) usrc 
    unpivot 
    (
    value 
    for col in (totalcount, totalpercent) 
) un 
) srcpiv 
pivot 
(
    max(value) 
    for col in ([TotalCount901], [totalPercent901], 
       [TotalCount902], [totalPercent902], 
       [TotalCount903], [totalPercent903], 
       [TotalCount909], [totalPercent909]) 
) p 

SQL Fiddle with Demo

참고 항목 : UNPIVOT를 수행 할 때 열이 같은 데이터 형이어야합니다. 일치하지 않으면 데이터 유형을 동일하게 변환/변환해야합니다. 당신은 변환 할 값의 알 수없는 번호가있는 경우

, 동적 SQL을 사용할 수 있습니다

DECLARE @query AS NVARCHAR(MAX), 
    @colsPivot as NVARCHAR(MAX) 


select @colsPivot 
    = STUFF((SELECT ',' 
      + QUOTENAME(c.name + 
         cast(QUESTION as varchar(10)) 
         +cast(subquestion as varchar(10)) 
         +cast(SubSubQuestion as varchar(10))) 
      from yourtable t 
      cross apply sys.columns as C 
      where C.object_id = object_id('yourtable') and 
       C.name in ('TotalCount', 'TotalPercent') 
      group by c.name, t.question, t.subquestion, t.subsubquestion 
      order by t.SubSubQuestion 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'select * 
       from 
       (
       select id, 
        language, 
        col + cast(QUESTION as varchar(10)) 
        +cast(subquestion as varchar(10)) 
        +cast(SubSubQuestion as varchar(10)) col, 
        value 
       from 
       (
        select id, language, 
        cast(TotalCount as varchar(10)) TotalCount, 
        totalPercent, 
        question, subquestion, SubSubQuestion 
        from yourtable 
       ) usrc 
       unpivot 
       (
        value 
        for col in (totalcount, totalpercent) 
       ) un 
      ) srcpiv 
      pivot 
      (
       max(value) 
       for col in (' + @colsPivot + ') 
      ) p ' 

execute(@query) 

는 당신이 오류가 발생합니다 의미 "작동하지 않는다"으로 SQL Fiddle with Demo

+0

+1 훌륭한 답변입니다. 나는 그것이 OP가 SubSubQuestion = 9 항목을 빠져 나가고있는 것처럼 보일뿐입니다. 또한 여러 ID 및 언어 시나리오도 처리 할 수 ​​있다는 증거가 있습니다. http://sqlfiddle.com/#!3/b91b0/1 – mellamokb

+0

@mellamokb 그 생각은 제가 생각하기는하지만, 열 이름. 확실하지는 않지만 요구 사항이 100 % 명확하지는 않습니다. 그리고 예제에 대한 모든 값을 포함했습니다. – Taryn

+0

나는 너의 것을 사용했지만 어디 에나 널을 가지고있다. 쿼리를 다시 보게 될 것입니다. – masfenix