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 |
문제를 해결하는 데 필요한 최소한의 지식을 보여 주어야합니다. 시도한 해결책, 실패한 이유 및 예상되는 결과를 포함시킵니다. – Kermit
[행이있는 테이블 조인] 가능한 복제본 (http://stackoverflow.com/questions/13583028/join-tables-withrows) –