SQL Server를 사용하고 있으므로 여러 가지 방법으로 행을 열로 변환 할 수 있습니다. CASE 식과 함께 집계 함수를 사용할 수 있습니다.
select empid,
max(case when empindex = 1 then empstate end) empState1,
max(case when empindex = 1 then empStDate end) empStDate1,
max(case when empindex = 1 then empEndDate end) empEndDate1,
max(case when empindex = 2 then empstate end) empState2,
max(case when empindex = 2 then empStDate end) empStDate2,
max(case when empindex = 2 then empEndDate end) empEndDate2
from sourcetbl
group by empid;
SQL Fiddle with Demo을 참조하십시오.
결과를 얻기 위해 PIVOT 함수를 사용하려면 먼저 empState
, empStDate
및 empEndDate
열을 unpivoting하여 여러 행을 먼저 표시하는 것이 좋습니다. 코드가 될 것입니다 당신은 UNPIVOT 기능을 사용하거나 CROSS는 데이터를 변환에 적용
select empid, col+cast(empindex as varchar(10)) col, value
from sourcetbl
cross apply
(
select 'empstate', empstate union all
select 'empstdate', convert(varchar(10), empstdate, 120) union all
select 'empenddate', convert(varchar(10), empenddate, 120)
) c (col, value);
는 Demo를 참조하십시오. 데이터가 피봇 팅되면 최종 코드가 될 수 있도록, 당신은 PIVOT 기능을 적용 할 수
select empid,
empState1, empStDate1, empEndDate1,
empState2, empStDate2, empEndDate2
from
(
select empid, col+cast(empindex as varchar(10)) col, value
from sourcetbl
cross apply
(
select 'empstate', empstate union all
select 'empstdate', convert(varchar(10), empstdate, 120) union all
select 'empenddate', convert(varchar(10), empenddate, 120)
) c (col, value)
) d
pivot
(
max(value)
for col in (empState1, empStDate1, empEndDate1,
empState2, empStDate2, empEndDate2)
) piv;
이 SQL Fiddle with Demo를 참조하십시오. 당신이 empindex
제한된 수의 경우
는 버전 위
목은 잘 작동합니다 있지만 경우에하는 당신은 동적 SQL 사용할 수 있습니다
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(empindex as varchar(10)))
from SourceTbl
cross apply
(
select 'empstate', 1 union all
select 'empstdate', 2 union all
select 'empenddate', 3
) c (col, so)
group by col, so, empindex
order by empindex, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT empid,' + @cols + '
from
(
select empid, col+cast(empindex as varchar(10)) col, value
from sourcetbl
cross apply
(
select ''empstate'', empstate union all
select ''empstdate'', convert(varchar(10), empstdate, 120) union all
select ''empenddate'', convert(varchar(10), empenddate, 120)
) c (col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '
execute sp_executesql @query;
참조 SQL을 Fiddle with Demo
당신은 삽입하려면 다음 쿼리를 사용할 수 있습니다
DestTbl
에 있거나 데이터를이 형식으로 저장하는 대신 이제 원하는 결과를 얻기위한 쿼리를 사용할 수 있습니다.
이 쿼리는 형식으로 데이터를 배치 : 내가 상상했던 것보다
| EMPID | EMPSTATE1 | EMPSTDATE1 | EMPENDDATE1 | EMPSTATE2 | EMPSTDATE2 | EMPENDDATE2 |
---------------------------------------------------------------------------------------
| 10 | AL | 2012-01-01 | 2012-12-01 | FL | 2012-02-01 | 2013-02-01 |
| 15 | FL | 2012-03-20 | 2099-01-01 | (null) | (null) | (null) |
피벗은 msaccess에서 변환이라고도합니다. 당신의 질문은 결과 셀에 텍스트 (정수가 아님)가 있다는 점에서 독특합니다. 집계 함수가 여전히 적용되어야합니다. MIN()은 단 하나의 텍스트 값이있을 때에도 Text 값에 대해 잘 수행해야합니다. – hamish