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

एसक्यूएल में कॉलम और पंक्तियों को स्थानांतरित करने का आसान तरीका?

ऐसे कई तरीके हैं जिनसे आप इस डेटा को रूपांतरित कर सकते हैं। अपनी मूल पोस्ट में, आपने कहा था कि PIVOT इस परिदृश्य के लिए बहुत जटिल लगता है, लेकिन इसे UNPIVOT . दोनों का उपयोग करके बहुत आसानी से लागू किया जा सकता है और PIVOT SQL सर्वर में कार्य करता है।

हालांकि, यदि आपके पास उन कार्यों तक पहुंच नहीं है, तो इसे UNION ALL . का उपयोग करके दोहराया जा सकता है करने के लिए UNPIVOT और फिर एक CASE . के साथ एक समग्र फ़ंक्शन PIVOT . को बयान :

तालिका बनाएं:

CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);

INSERT INTO yourTable
    ([color], [Paul], [John], [Tim], [Eric])
VALUES
    ('Red', 1, 5, 1, 3),
    ('Green', 8, 4, 3, 5),
    ('Blue', 2, 2, 9, 1);

यूनियन ऑल, एग्रीगेट और केस संस्करण:

select name,
  sum(case when color = 'Red' then value else 0 end) Red,
  sum(case when color = 'Green' then value else 0 end) Green,
  sum(case when color = 'Blue' then value else 0 end) Blue
from
(
  select color, Paul value, 'Paul' name
  from yourTable
  union all
  select color, John value, 'John' name
  from yourTable
  union all
  select color, Tim value, 'Tim' name
  from yourTable
  union all
  select color, Eric value, 'Eric' name
  from yourTable
) src
group by name

डेमो के साथ SQL Fiddle देखें

UNION ALL UNPIVOT करता है कॉलम Paul, John, Tim, Eric को बदलकर डेटा का अलग पंक्तियों में। फिर आप समग्र कार्य लागू करते हैं sum() case . के साथ प्रत्येक color . के लिए नए कॉलम प्राप्त करने के लिए कथन ।

अनपिवट और पिवट स्टेटिक वर्जन:

दोनों UNPIVOT और PIVOT SQL सर्वर में फ़ंक्शन इस परिवर्तन को बहुत आसान बनाते हैं। यदि आप उन सभी मानों को जानते हैं जिन्हें आप रूपांतरित करना चाहते हैं, तो आप परिणाम प्राप्त करने के लिए उन्हें एक स्थिर संस्करण में हार्ड-कोड कर सकते हैं:

select name, [Red], [Green], [Blue]
from
(
  select color, name, value
  from yourtable
  unpivot
  (
    value for name in (Paul, John, Tim, Eric)
  ) unpiv
) src
pivot
(
  sum(value)
  for color in ([Red], [Green], [Blue])
) piv

डेमो के साथ SQL Fiddle देखें

UNPIVOT . के साथ आंतरिक क्वेरी UNION ALL . के समान कार्य करता है . यह स्तंभों की सूची लेता है और इसे पंक्तियों में बदल देता है, PIVOT फिर कॉलम में अंतिम परिवर्तन करता है।

डायनामिक पिवट संस्करण:

यदि आपके पास अज्ञात संख्या में स्तंभ हैं (Paul, John, Tim, Eric आपके उदाहरण में) और फिर आपको बदलने के लिए रंगों की एक अज्ञात संख्या UNPIVOT की सूची बनाने के लिए गतिशील sql का उपयोग कर सकती है और फिर PIVOT :

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name <> 'color'
         for xml path('')), 1, 1, '')

select @colsPivot = STUFF((SELECT  ',' 
                      + quotename(color)
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select name, '[email protected]+'
      from
      (
        select color, name, value
        from yourtable
        unpivot
        (
          value for name in ('[email protected]+')
        ) unpiv
      ) src
      pivot
      (
        sum(value)
        for color in ('[email protected]+')
      ) piv'

exec(@query)

डेमो के साथ SQL Fiddle देखें

डायनेमिक संस्करण yourtable both दोनों को क्वेरी करता है और फिर sys.columns UNPIVOT में आइटम्स की सूची जेनरेट करने के लिए तालिका और PIVOT . इसके बाद इसे निष्पादित करने के लिए एक क्वेरी स्ट्रिंग में जोड़ा जाता है। यदि आपके पास colors . की एक बदलती हुई सूची है, तो गतिशील संस्करण का लाभ यह है और/या names यह रन-टाइम पर सूची तैयार करेगा।

तीनों प्रश्न एक ही परिणाम देंगे:

| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric |   3 |     5 |    1 |
| John |   5 |     4 |    2 |
| Paul |   1 |     8 |    2 |
|  Tim |   1 |     3 |    9 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या मेरे पास SQL ​​​​सर्वर में एक दृश्य में एक कॉलम का संदर्भ देने वाली एक विदेशी कुंजी हो सकती है?

  2. SQL सर्वर में sys.objects, sys.system_objects और sys.all_objects के बीच अंतर

  3. SQL सर्वर 2012 में विस्तारित ईवेंट में एक महत्वपूर्ण परिवर्तन

  4. SQL:शीर्ष 3 रिकॉर्ड + मात्रा का योग चुनें

  5. SQL सर्वर के प्रदर्शन को आसान बनाएं