2013-09-25 3 views
0

현재 데이터를 필요한 것으로 변경해야하는 시나리오가 있습니다.여러 열을 단일 행으로 변환

다음은 데이터

ColumnA ColumnB ColumnC 
     P  Q  R 
     S  T  U 
     V  W  X 

필수 포맷

ColumnA1 ColumnB1 ColumnC1 ColumnA2 ColumnB2 ColumnC2 ColumnA3 ColumnB3 ColumnC3  
    P   Q   R  S  T   U   V  W  x 

이 나를 도와주세요입니다.

+0

문제를 해결하는 데 필요한 최소한의 지식을 보여 주어야합니다. 시도한 해결책, 실패한 이유 및 예상되는 결과를 포함시킵니다. – Kermit

+0

[행이있는 테이블 조인] 가능한 복제본 (http://stackoverflow.com/questions/13583028/join-tables-withrows) –

답변

1

row_number을 사용하여 데이터의 각 행에 대한 시퀀스를 생성하는 것과 관련된 결과를 얻을 수있는 몇 가지 방법이 있습니다.

당신은 CASE 표현식으로 집계 함수를 사용할 수 있습니다

select 
    max(case when seq = 1 then columna end) columna_1, 
    max(case when seq = 1 then columnb end) columnb_1, 
    max(case when seq = 1 then columnc end) columnc_1, 
    max(case when seq = 2 then columna end) columna_2, 
    max(case when seq = 2 then columnb end) columnb_2, 
    max(case when seq = 2 then columnc end) columnc_2, 
    max(case when seq = 3 then columna end) columna_3, 
    max(case when seq = 3 then columnb end) columnb_3, 
    max(case when seq = 3 then columnc end) columnc_3 
from 
(
    select columna, columnb, columnc, 
    row_number() over(order by columna) seq 
    from yourtable 
) d; 

SQL Fiddle with Demo를 참조하십시오.

PIVOT 기능을 사용할 수 있지만 3 열의 데이터를 unpivot 한 다음 PIVOT을 적용해야합니다. unpivot 프로세스는 3 열의 데이터를 여러 행으로 변환합니다. 당신은 UNPIVOT 기능을 사용하거나 CROSS이 작업을 수행하기 위해 적용 :

select ColumnA_1, ColumnB_1, ColumnC_1, 
    ColumnA_2, ColumnB_2, ColumnC_2, 
    ColumnA_3, ColumnB_3, ColumnC_3 
from 
(
    select col = col+'_'+cast(seq as varchar(10)), 
    value 
    from 
    (
    select columna, columnb, columnc, 
     row_number() over(order by columna) seq 
    from yourtable 
) d 
    cross apply 
    (
    select 'ColumnA', columna union all 
    select 'ColumnB', columnb union all 
    select 'ColumnC', columnc 
) c (col, value) 
) s 
pivot 
(
    max(value) 
    for col in (ColumnA_1, ColumnB_1, ColumnC_1, 
       ColumnA_2, ColumnB_2, ColumnC_2, 
       ColumnA_3, ColumnB_3, ColumnC_3) 
) piv; 

SQL Fiddle with Demo를 참조하십시오. 당신은 제한된 수의 또는 알려진 값이있는 경우 위의 두 가지 버전이 잘 작동하지만, 당신이 알 수없는 번호가한다면, 당신은 최종 결과를 얻기 위해 동적 SQL을 사용하여보고해야합니다 :

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

select @cols = STUFF((SELECT ',' + QUOTENAME(col+'_'+cast(seq as varchar(10))) 
        from 
        (
         select row_number() over(order by columna) seq 
         from yourtable 
        ) d 
        cross apply 
        (
         select 'ColumnA', 1 union all 
         select 'ColumnB', 2 union all 
         select 'ColumnC', 3 
        ) c (col, so) 
        group by col, seq, so 
        order by seq, so 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT ' + @cols + ' 
      from 
      (
       select col = col+''_''+cast(seq as varchar(10)), 
       value 
       from 
       (
       select columna, columnb, columnc, 
        row_number() over(order by columna) seq 
       from yourtable 
      ) d 
       cross apply 
       (
       select ''ColumnA'', columna union all 
       select ''ColumnB'', columnb union all 
       select ''ColumnC'', columnc 
      ) c (col, value) 
      ) x 
      pivot 
      (
       max(value) 
       for col in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo 참조 . 모든 버전에서 결과를 얻을 수 있습니다 :

| COLUMNA_1 | COLUMNB_1 | COLUMNC_1 | COLUMNA_2 | COLUMNB_2 | COLUMNC_2 | COLUMNA_3 | COLUMNB_3 | COLUMNC_3 | 
|   P |   Q |   R |   S |   T |   U |   V |   W |   X |