За този тип данни ще трябва да внедрите както 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 | Студент |