Vì bạn đang sử dụng SQL Server nên có một số cách khác nhau để bạn có thể chuyển đổi các hàng thành cột. Bạn có thể sử dụng một hàm tổng hợp với biểu thức 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;
Xem SQL Fiddle với Demo.
Nếu bạn muốn sử dụng hàm PIVOT để nhận kết quả, thì trước tiên tôi khuyên bạn nên bỏ chia các cột empState
, empStDate
và empEndDate
vì vậy bạn sẽ có nhiều hàng trước. Bạn có thể sử dụng chức năng UNPIVOT hoặc ÁP DỤNG CHÉO để chuyển đổi dữ liệu mà mã sẽ là:
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);
Xem Demo. Sau khi dữ liệu được bỏ phân chia, bạn có thể áp dụng hàm PIVOT để mã cuối cùng sẽ là:
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;
Xem SQL Fiddle với Demo.
Các phiên bản trên sẽ hoạt động tốt nếu bạn có một số lượng giới hạn empindex
, nhưng nếu không thì bạn có thể sử dụng SQL động:
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;
Xem SQL Fiddle với Demo
Bạn có thể sử dụng các truy vấn này để CHÈN VÀO DestTbl
của bạn hoặc thay vì lưu trữ dữ liệu ở định dạng này, bây giờ bạn có một truy vấn để nhận được kết quả mong muốn.
Các truy vấn này đặt dữ liệu ở định dạng:
| 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) |