Докато отговорът на M.Ali ще ви даде резултата, тъй като използвате SQL Server 2012, бих разменил name
и адрес
колони малко по-различни, за да получите крайния резултат.
Тъй като използвате SQL Server 2012, можете да използвате CROSS APPLY
с VALUES
за да развъртите тези множество колони в няколко реда. Но преди да направите това, бих използвал row_number()
за да получите общия брой нови колони, които ще имате.
Кодът за „ОТКЛЮЧВАНЕ“ на данните с помощта на CROSS APPLY изглежда така:
изберете d.loanid, col =c.col + cast(seq as varchar(10)), c.valuefrom( изберете loanid, име, адрес, row_number() над (разделяне по loanid ред по loanid) seq от вашата таблица) dcross apply( стойности ('име', име), ('адрес', адрес)) c(col, value);
Вижте SQL Fiddle с демонстрация. Това ще доведе вашите данни във формат, подобен на:
<предварителен код>| LOANID | COL | СТОЙНОСТ ||--------|----------|----------|| 1 | име1 | Джон || 1 | адрес1 | Ню Йорк || 1 | име2 | Карл || 1 | адрес2 | Ню Йорк || 1 | име3 | Хенри || 1 | адрес3 | Бостън |
Вече имате една колона COL
с всичките ви нови имена на колони и свързаните стойности също са в една колона. Новите имена на колони вече имат число в края (1, 2, 3 и т.н.) въз основа на колко общо записа имате на loanid
. Сега можете да приложите PIVOT:
изберете loanid, name1, address1, name2, address2, name3, address3from( изберете d.loanid, col =c.col + cast(seq as varchar(10)), c.value от ( изберете loanid, name, address, row_number() over(partition by loanid order by loanid) seq от вашата таблица ) d cross apply (стойности ('name', name), ('address', address) ) c(col, value)) srcpivot( max(стойност) за col в (име1, адрес1, име2, адрес2, име3, адрес3)) piv;
Вижте SQL Fiddle с демонстрация. И накрая, ако не знаете колко двойки Име
и Адрес
ще имате, тогава можете да използвате динамичен SQL:
ДЕКЛАРИРАЙТЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10))) от ( изберете row_number() over(partition by loanid order by loanid) seq от вашата таблица ) d cross apply (изберете 'Име', 1 съюз всички изберете 'Address', 2) c (col, so) групирайте по seq, col, така че подредете от seq, така че ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ loanid,' + @cols + ' от ( изберете d.loanid, col =c.col + cast(seq as varchar(10)), c.value от ( изберете loanid, име, адрес, row_number() over(partition by loanid order by loanid) seq от вашата таблица ) d cross apply (стойности (''name'', name), (''address'', address) ) c(col, value) ) x pivot ( max(стойност) за col в (' + @cols + ') ) p 'exec sp_executesql @query;
Вижте SQL Fiddle с демонстрация. И двете версии дават резултат:
<предварителен код>| LOANID | ИМЕ1 | АДРЕС1 | ИМЕ2 | АДРЕС2 | ИМЕ3 | АДРЕС3 ||--------|--------|----------|--------|--------- -|--------|----------|| 1 | Джон | Ню Йорк | Карл | Ню Йорк | Хенри | Бостън || 2 | Робърт | Чикаго | (нула) | (нула) | (нула) | (нула) || 3 | Джоана | LA | Крис | LA | (нула) | (нула) |