Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Завъртане на няколко колони въз основа на една колона в SQL Server

Тъй като използвате 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 | (нула) | (нула) | (нула) |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да предадете масив в съхранена процедура на SQL Server

  2. Кой е най-подходящият тип данни за съхраняване на IP адрес в SQL сървър?

  3. Параметризираната заявка ..... очаква параметъра '@units', който не беше предоставен

  4. 3 области, които ще се възползват от използването на инструмент за наблюдение на производителността на SQL Server

  5. Форматирайте SQL в SQL Server Management Studio