Sementara jawaban M.Ali akan memberi Anda hasilnya, karena Anda menggunakan SQL Server 2012 saya akan melepas name
dan address
kolom sedikit berbeda untuk mendapatkan hasil akhir.
Karena Anda menggunakan SQL Server 2012, Anda dapat menggunakan CROSS APPLY
dengan VALUES
untuk melepaskan beberapa kolom ini menjadi beberapa baris. Tapi sebelum Anda melakukannya, saya akan menggunakan row_number()
untuk mendapatkan jumlah total kolom baru yang akan Anda miliki.
Kode untuk "UNPIVOT" data menggunakan CROSS APPLY terlihat seperti:
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);
Lihat SQL Fiddle dengan Demo. Ini akan membuat data Anda menjadi format yang mirip dengan:
| LOANID | COL | VALUE |
|--------|----------|----------|
| 1 | name1 | John |
| 1 | address1 | New York |
| 1 | name2 | Carl |
| 1 | address2 | New York |
| 1 | name3 | Henry |
| 1 | address3 | Boston |
Anda sekarang memiliki satu kolom COL
dengan semua nama kolom baru Anda dan nilai yang terkait juga berada dalam satu kolom. Nama kolom baru sekarang memiliki nomor di akhir (1, 2, 3, dll) berdasarkan berapa banyak total entri yang Anda miliki per loanid
. Sekarang Anda dapat menerapkan 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;
Lihat SQL Fiddle dengan Demo. Terakhir jika Anda tidak tahu berapa banyak pasangan Name
dan Address
Anda akan memiliki maka Anda dapat menggunakan SQL dinamis:
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;
Lihat SQL Fiddle dengan Demo. Kedua versi memberikan hasil:
| 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) |