मेरा सुझाव है कि जब भी आप PIVOT के साथ काम कर रहे हों तो पहले क्वेरी को हार्ड-कोडेड मानों के साथ लिखें, फिर आप आसानी से क्वेरी को एक गतिशील समाधान में बदल सकते हैं।
चूँकि आपके पास columnC
. के अनेक मान होने वाले हैं जिसे कॉलम में बदल दिया जाएगा, फिर आपको row_number()
. का उपयोग करके देखना होगा प्रत्येक columnc
. के लिए एक अद्वितीय अनुक्रम उत्पन्न करने के लिए विंडोिंग फ़ंक्शन columnA
. के मानों के आधार पर और columnB
।
आपकी क्वेरी के लिए शुरुआती बिंदु होगा:
select [ColumnA],
[ColumnB],
[ColumnC],
'SampleTitle'+
cast(row_number() over(partition by columna, columnb
order by columnc) as varchar(10)) seq
from DataSource;
डेमो देखें। यह क्वेरी नए कॉलम नामों की सूची तैयार करेगी SampleTitle1
, आदि:
| COLUMNA | COLUMNB | COLUMNC | SEQ |
|---------|---------|---------|--------------|
| 5060 | 1006 | 100118 | SampleTitle1 |
| 5060 | 1006 | 100119 | SampleTitle2 |
| 5060 | 1006 | 100120 | SampleTitle3 |
फिर आप columnC
. पर पिवट लागू कर सकते हैं seq
. में सूचीबद्ध नए कॉलम नामों के साथ :
select columnA, columnB,
SampleTitle1, SampleTitle2, SampleTitle3
from
(
select [ColumnA],
[ColumnB],
[ColumnC],
'SampleTitle'+
cast(row_number() over(partition by columna, columnb
order by columnc) as varchar(10)) seq
from DataSource
) d
pivot
(
max(columnc)
for seq in (SampleTitle1, SampleTitle2, SampleTitle3)
) piv;
डेमो के साथ SQL Fiddle देखें।
एक बार जब आपके पास सही तर्क हो, तो आप डेटा को डायनेमिक SQL में बदल सकते हैं। यहां कुंजी नए कॉलम नामों की सूची तैयार कर रही है। मैं आमतौर पर FOR XML PATH
का उपयोग करता हूं इसके समान:
select STUFF((SELECT distinct ',' + QUOTENAME(seq)
from
(
select 'SampleTitle'+
cast(row_number() over(partition by columna, columnb
order by columnc) as varchar(10)) seq
from DataSource
) d
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
डेमो देखें। एक बार आपके पास कॉलम नामों की सूची हो जाने के बाद, आप निष्पादित करने के लिए अपनी एसक्यूएल स्ट्रिंग उत्पन्न करेंगे, पूरा कोड होगा:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(seq)
from
(
select 'SampleTitle'+
cast(row_number() over(partition by columna, columnb
order by columnc) as varchar(10)) seq
from DataSource
) d
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT columnA, ColumnB,' + @cols + '
from
(
select [ColumnA],
[ColumnB],
[ColumnC],
''SampleTitle''+
cast(row_number() over(partition by columna, columnb
order by columnc) as varchar(10)) seq
from DataSource
) x
pivot
(
max(columnc)
for seq in (' + @cols + ')
) p '
execute sp_executesql @query;
डेमो के साथ SQL Fiddle देखें। ये परिणाम देते हैं:
| COLUMNA | COLUMNB | SAMPLETITLE1 | SAMPLETITLE2 | SAMPLETITLE3 |
|---------|---------|--------------|--------------|--------------|
| 5060 | 1006 | 100118 | 100119 | 100120 |
| 5060 | 1007 | 100121 | 100122 | (null) |
| 5060 | 1012 | 100123 | (null) | (null) |