Si bien la respuesta de M.Ali le dará el resultado, dado que está utilizando SQL Server 2012, desvincularía el name
y address
columnas ligeramente diferentes para obtener el resultado final.
Como está usando SQL Server 2012, puede usar CROSS APPLY
con VALUES
para deshacer el pivote de estas múltiples columnas en múltiples filas. Pero antes de hacer eso, usaría row_number()
para obtener el número total de nuevas columnas que tendrá.
El código para "UNPIVOT" los datos usando CROSS APPLY se ve así:
select d.loanid,
col = c.col + cast(seq as varchar(10)),
c.value
from
(
select loanid, name, address,
row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
values
('name', name),
('address', address)
) c(col, value);
Consulte SQL Fiddle con demostración. Esto va a poner sus datos en un formato similar a:
| LOANID | COL | VALUE |
|--------|----------|----------|
| 1 | name1 | John |
| 1 | address1 | New York |
| 1 | name2 | Carl |
| 1 | address2 | New York |
| 1 | name3 | Henry |
| 1 | address3 | Boston |
Ahora tiene una sola columna COL
con todos sus nuevos nombres de columna y los valores asociados también están en una sola columna. Los nuevos nombres de columna ahora tienen un número al final (1, 2, 3, etc.) según la cantidad total de entradas que tenga por loanid
. Ahora puedes aplicar PIVOT:
select loanid,
name1, address1, name2, address2,
name3, address3
from
(
select d.loanid,
col = c.col + cast(seq as varchar(10)),
c.value
from
(
select loanid, name, address,
row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
values
('name', name),
('address', address)
) c(col, value)
) src
pivot
(
max(value)
for col in (name1, address1, name2, address2,
name3, address3)
) piv;
Consulte SQL Fiddle con demostración. Finalmente, si no sabe cuántos pares de Name
y Address
tendrá entonces puede usar SQL dinámico:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10)))
from
(
select row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
select 'Name', 1 union all
select 'Address', 2
) c (col, so)
group by seq, col, so
order by seq, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT loanid,' + @cols + '
from
(
select d.loanid,
col = c.col + cast(seq as varchar(10)),
c.value
from
(
select loanid, name, address,
row_number() over(partition by loanid
order by loanid) seq
from yourtable
) d
cross apply
(
values
(''name'', name),
(''address'', address)
) c(col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '
exec sp_executesql @query;
Consulte SQL Fiddle con demostración. Ambas versiones dan un resultado:
| LOANID | NAME1 | ADDRESS1 | NAME2 | ADDRESS2 | NAME3 | ADDRESS3 |
|--------|--------|----------|--------|----------|--------|----------|
| 1 | John | New York | Carl | New York | Henry | Boston |
| 2 | Robert | Chicago | (null) | (null) | (null) | (null) |
| 3 | Joanne | LA | Chris | LA | (null) | (null) |