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

редове в колони

За този тип данни ще трябва да внедрите както UNPIVOT и след това PIVOT функции на SQL Server. UNPIVOT взема вашите данни от множеството колони и ги поставя в две колони и след това прилагате PIVOT за да трансформирате данните обратно в колони.

Ако знаете всички стойности, които искате да трансформирате, тогава можете да ги кодирате твърдо, подобно на това:

select *from( select value, col+'_'+cast(rn as varchar(10)) col from ( select nvrchildname, nvrgender, convert(varchar(10), dttchildDOB, 120) dttchildDOB, occupation, row_number() over(partition by intsid order by intCHID) rn from tblHRIS_ChildDetails where intsid =463 ) src unpivot (стойност за col in (nvrchildname, nvrgender, dttchildDOB, occupation) ) unpiv) src1pivot( max(value) for col in ([ nvrchildname_1], [nvrgender_1], [dttchildDOB_1], [occupation_1], [nvrchildname_2], [nvrgender_2], [dttchildDOB_2], [occupation_2]) ) piv 

Вижте SQL Fiddle с демонстрация

Сега, ако имате неизвестен брой стойности за трансформиране, тогава можете да използвате динамичен SQL за това:

DECLARE @colsUnpivot AS NVARCHAR(MAX), @query AS NVARCHAR(MAX), @colsPivot като NVARCHAR(MAX)select @colsUnpivot =stuff((select ','+quotename(C.name) from sys .columns като C, където C.object_id =object_id('tblHRIS_ChildDetails') и C.name не е в ('intCHID', 'intsid') за xml път ('')), 1, 1, '') изберете @colsPivot =STUFF((SELECT ',' + quotename(c.name +'_'+ cast(t.rn as varchar(10))) from ( select row_number() over(partition by intsid order by intCHID) rn from tblHRIS_ChildDetails ) t cross apply sys.columns като C, където C.object_id =object_id('tblHRIS_ChildDetails') и C.name не е в ('intCHID', 'intsid') група по c.name, t.rn ред по t.rn ЗА XML ПЪТ (''), TYPE ).value( '.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='select * from ( select col+''_''+cast(rn as varchar(10)) col, value from ( изберете nvrchildname, nvrgender, convert(varchar(10), dttchildDOB, 120) dttchildDOB, occupation, row_number() over(partition by intsid order by intCHID) rn from tblHRIS_ChildDetails where intsid =463 ) x unpivot (стойност за col in ('+ @colsunpivot +') ) u ) x1 опорна точка ( max(стойност) за колона в ('+ @colspivot +') ) p'exec(@query) 

Вижте SQL Fiddle с демонстрация

Резултатът от двете заявки е:

<предварителен код>| NVRCHILDNAME_1 | NVRGENDER_1 | DTTCHILDDOB_1 | OCCUPATION_1 | NVRCHILDNAME_2 | NVRGENDER_2 | DTTCHILDDOB_2 | OCCUPATION_2 |------------------------------------------------ -------------------------------------------------- ----------------------------| SK | Жена | 2001-12-11 | Учене | SM | Мъж | 2007-10-08 | Студент |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дублирани резултати при изпълнение на INNER JOIN

  2. Актуализирайте колоната varbinary(MAX).

  3. Как да изброя всички колони в таблица?

  4. Еквивалент на MySQL ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ в Sql Server

  5. Как да създам стъпка в моята задача за агент на SQL Server, която ще изпълнява моя SSIS пакет?