कुछ तरीके हैं जिनसे आप डेटा को पंक्तियों से कॉलम में बदल सकते हैं।
चूंकि आप SQL Server 2008 का उपयोग कर रहे हैं, तो आप PIVOT फ़ंक्शन का उपयोग कर सकते हैं।
मैं row_number()
. का उपयोग करने का सुझाव दूंगा डेटा को पिवट करने में सहायता करने के लिए कार्य करता है। यदि आपके पास ज्ञात संख्या में मान हैं, तो आप क्वेरी को हार्ड-कोड कर सकते हैं:
select user, category1, category2, category3, category4
from
(
select [user], category,
'Category'+cast(row_number() over(partition by [user]
order by [user]) as varchar(3)) rn
from yt
) d
pivot
(
max(category)
for rn in (category1, category2, category3, category4)
) piv;
देखें SQL Fiddle with Demo ।
आपकी स्थिति के लिए आपने कहा था कि आपके पास अज्ञात संख्या में मान होंगे जिन्हें कॉलम होने की आवश्यकता है। उस स्थिति में, आप निष्पादित करने के लिए क्वेरी स्ट्रिंग उत्पन्न करने के लिए गतिशील SQL का उपयोग करना चाहेंगे:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Category'+cast(row_number() over(partition by [user]
order by [user]) as varchar(3)))
from yt
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [user],' + @cols + '
from
(
select [user], category,
''Category''+cast(row_number() over(partition by [user]
order by [user]) as varchar(3)) rn
from yt
) d
pivot
(
max(category)
for rn in (' + @cols + ')
) p '
execute(@query)
देखें SQL Fiddle with Demo . दोनों एक परिणाम देते हैं:
| USER | CATEGORY1 | CATEGORY2 | CATEGORY3 | CATEGORY4 |
----------------------------------------------------------
| Bruce | Laptop | Beer | (null) | (null) |
| Chuck | Cell Phone | (null) | (null) | (null) |
| Jack | Shoes | Tie | Glass | (null) |
| Peggy | Shoe | Skirt | Bat | Cat |