Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

डायनामिक कॉलम काउंट के साथ पंक्ति मानों को कॉलम में कैसे बदलें?

मेरा सुझाव है कि जब भी आप 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) |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं डैपर के साथ एक इन्सर्ट और रिटर्न इन्सर्टेड आइडेंटिटी कैसे करूँ?

  2. एकाधिक तालिकाओं के लिए विदेशी कुंजी

  3. SQL सर्वर प्रतीक्षा ईवेंट -2

  4. SQL सर्वर में टेबल-वैल्यूड फ़ंक्शन को बदलें

  5. क्या मैं SQL सर्वर (C#) में एक पंक्ति को INSERT या अद्यतन करने के लिए स्ट्रीम का उपयोग कर सकता हूं?