ऐसे कई तरीके हैं जिनसे आप इस डेटा को रूपांतरित कर सकते हैं। अपनी मूल पोस्ट में, आपने कहा था कि 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 |