Тъй като използвате SQL Server, има няколко различни начина, по които можете да преобразувате редовете в колони. Можете да използвате агрегатна функция с CASE израз:
изберете empid, max(случай, когато empindex =1, след това край на empstate) empState1, max(случай, когато empindex =1, след това край empStDate) empStDate1, max(случай, когато empindex =1, след това край empEndDate) empEndDate1, max( случай, когато empindex =2, след това край на empstate) empState2, max(случай, когато empindex =2, след това край empStDate) empStDate2, max(случай, когато empindex =2 след това край на empEndDate) empEndDate2 от sourcetblgroup от empid;
Вижте SQL Fiddle с демонстрация.
Ако искате да използвате функцията PIVOT, за да получите резултата, тогава бих препоръчал първо да премахнете завъртането на колоните empState
, empStDate
и empEndDate
така че първо ще имате няколко реда. Можете да използвате функцията UNPIVOT или CROSS APPLY, за да конвертирате данните, които кодът ще бъде:
изберете empid, col+cast(empindex as varchar(10)) col, valuefrom sourcetblcross apply( изберете 'empstate', empstate union всички изберете 'empstdate', convert(varchar(10), empstdate, 120)) union all select 'empenddate', convert(varchar(10), empenddate, 120)) c (col, value);
Вижте Демо. След като данните се върнат обратно, можете да приложите функцията PIVOT, така че крайният код ще бъде:
изберете empid, empState1, empStDate1, empEndDate1, empState2, empStDate2, empEndDate2from ( изберете empid, col+cast(empindex като varchar(10)) col, стойност от sourcetbl кръстосано прилагане ( изберете 'empstate un all изберете 'empstdate', convert(varchar(10), empstdate, 120) union all изберете 'empenddate', convert(varchar(10), empenddate, 120) ) c (col, value)) dpivot( max(value) за col в (empState1, empStDate1, empEndDate1, empState2, empStDate2, empEndDate2)) piv;
Вижте SQL Fiddle с демонстрация.
Версиите по-горе ще работят чудесно, ако имате ограничен брой empindex
, но ако не, тогава можете да използвате динамичен SQL:
ДЕКЛАРИРАЙТЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(col+cast(empindex като varchar(10))) от SourceTbl кръстосано прилагане ( изберете 'empstate', 1 съюз всички изберете 'empstdate', 2 съюз всички изберете 'empenddate', 3 ) c (col, so) група по col, така, empindex подреждане по empindex, така че FOR XML PATH('' ), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ empid,' + @cols + ' от ( изберете empid, col+cast(empindex като varchar(10)) col, стойност от sourcetbl се прилага кръстосано ( изберете ''empstate'', empstate union all изберете ''empstdate'', convert(varchar(10), empstdate, 120) union all изберете ''empstdate'' , convert(varchar(10), empenddate, 120) ) c (col, value) ) x pivot ( max(value) for col in (' + @cols + ') ) p 'изпълни sp_executesql @query;
Вижте SQL Fiddle с демонстрация
Можете да използвате тези заявки, за да INSERT INTO вашия 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 | (нула) | (нула) | (нула) |