जबकि M.Ali के उत्तर से आपको परिणाम मिलेगा, क्योंकि आप SQL Server 2012 का उपयोग कर रहे हैं, मैं name
को अनपिवट कर दूंगा और address
अंतिम परिणाम प्राप्त करने के लिए कॉलम थोड़े अलग हैं।
चूंकि आप SQL Server 2012 का उपयोग कर रहे हैं, आप CROSS APPLY
. का उपयोग कर सकते हैं VALUES
. के साथ इन एकाधिक स्तंभों को एकाधिक पंक्तियों में अनपिवट करने के लिए। लेकिन इससे पहले कि आप ऐसा करें, मैं row_number()
. का उपयोग करूंगा आपके पास कुल नए कॉलम प्राप्त करने के लिए।
CROSS APPLY का उपयोग करके डेटा को "UNPIVOT" करने के लिए कोड ऐसा दिखता है:
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);
डेमो के साथ SQL Fiddle देखें। यह आपके डेटा को निम्न के समान प्रारूप में प्राप्त करने जा रहा है:
| LOANID | COL | VALUE |
|--------|----------|----------|
| 1 | name1 | John |
| 1 | address1 | New York |
| 1 | name2 | Carl |
| 1 | address2 | New York |
| 1 | name3 | Henry |
| 1 | address3 | Boston |
अब आपके पास एक ही कॉलम है COL
आपके सभी नए कॉलम नामों के साथ और संबद्ध मान भी एक ही कॉलम में हैं। नए कॉलम नामों में अब अंत में एक संख्या (1, 2, 3, आदि) होती है, जो इस आधार पर होती है कि आपके पास प्रति loanid
में कुल कितनी प्रविष्टियां हैं। . अब आप 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;
डेमो के साथ SQL Fiddle देखें। अंत में यदि आप नहीं जानते हैं कि Name
. के कितने जोड़े हैं? और address
आपके पास तब आप गतिशील SQL का उपयोग कर सकते हैं:
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;
डेमो के साथ SQL Fiddle देखें। दोनों संस्करण एक परिणाम देते हैं:
| 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) |