2013-10-16 2 views
2

안녕하세요SQL 복잡한 동적 피벗 2

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

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

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

로 출력을 원하는 다음 테이블에 대한 SQL Server의 회전을 시도하고있다 행 수는 알려지지 않았습니다. 아무도 도와 줄 수 있습니다

+0

사용하는 SQLServer에 버전 쿼리가 될 값의 알려진 숫자에 대한

? –

+0

sql server 2005 – puneet

+0

[SQL Server 2005 Pivot on Unknown Number of Columns] 가능한 중복 (http://stackoverflow.com/questions/213702/sql-server-2005-pivot-on-unknown-number-of-columns) –

답변

5

sequence 숫자를 열 이름의 일부로 포함 시키려면 col1col2 열을 먼저 unpivot 한 다음 피벗을 적용해야합니다. 차이점은 sequence 숫자를 unpivot 프로세스 중에 작성된 열 이름에 연결한다는 것입니다. 알 수없는 번호가있는 경우

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

그런 다음 동적 SQL 버전이 될 것입니다 :

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

select @cols = STUFF((SELECT ',' + QUOTENAME(cast(Sequence as varchar(10))+ col) 
        from yourtable 
        cross apply 
        (
         select 'Col1', 1 union all 
         select 'Col2', 2 
        ) c(col, so) 
        group by Sequence, col, so 
        order by so, sequence 
        FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

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

execute sp_executesql @query;