2013-10-16 4 views
-3

안녕 나는 다음과 같은 테이블에 대한 SQL Server의 회전을 시도하고SQL 복잡한 동적 피벗

REFID | COL1 | COL2 | Sequence 
1  abc cde  1 
1  lmn rst  2 
1  kna asg  3 
2  als zkd  2 
2  zpk lad  1 

내가 원하는 원래 테이블의 열 수는 알려진

COLNAME REFID | 1 | 2 | 3 
    COL1 1  abc lmn kna 
    COL2 1  cde rst asg 
    COL1 2  zpk als null 
    COL2 2  lad zkd null 

으로 출력하지만, 행 수는 알려지지 않았습니다. 어느 누구라도 도와 줄 수 있습니다

+0

어떤 데이터베이스입니까? 그리고 그것을 시도한 것은 무엇입니까? –

+0

나는 아직도 초보자이다. 나는 피벗 문법을 찾았지만, 열이 여러개의 refID에 대해 반복적으로 행해졌다는 것을 전혀 발견하지 못했다. – puneet

+0

SQL 서버 2005에있다. – puneet

답변

2

최종 결과를 얻으려면 PIVOT 기능을 사용할 수 있지만 먼저 col1col2 열을 피벗 해제하면 여러 열을 피벗하지 않습니다. 당신이 열 제한된 수의 경우

는, 당신은 하드 코딩 할 수 쿼리 :

select REFID, col, [1], [2], [3] 
from 
(
    select REFID, Sequence, col, value 
    from yourtable 
    cross apply 
    (
     select 'COL1', col1 union all 
     select 'COL2', col2 
    ) c (col, value) 
) d 
pivot 
(
    max(value) 
    for sequence in ([1], [2], [3]) 
) piv 
order by refid; 

그러나 당신은 sequence 값을 알 수없는 번호가, 당신은 동적 SQL 사용할 수 있습니다

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(sequence) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT refid, col,' + @cols + ' 
      from 
      (
       select REFID, Sequence, col, value 
       from yourtable 
       cross apply 
       (
        select ''COL1'', col1 union all 
        select ''COL2'', col2 
       ) c (col, value) 
      ) x 
      pivot 
      (
       max(value) 
       for Sequence in (' + @cols + ') 
      ) p 
      order by refid' 

execute sp_executesql @query; 
+0

안녕하십니까? 내 편이 조금 틀리다. 새로운 질문은 다음 링크에 있습니다. http://stackoverflow.com/questions/19408047/sql-complex-dynamic-pivoting-2 도와주세요. – puneet