ऐसे कई तरीके हैं जिनसे आप इस डेटा को बदल सकते हैं। अपने मूल पोस्ट में, आपने कहा कि PIVOTइस परिदृश्य के लिए बहुत जटिल लगता है, लेकिन इसे SQL सर्वर में UNPIVOTऔरPIVOT कार्यों दोनों का उपयोग करके बहुत आसानी से लागू किया जा सकता है ।
हालाँकि, यदि आपके पास उन कार्यों तक पहुंच नहीं है, तो इसका उपयोग करके दोहराया जा सकता 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);
यूनियन ऑल, एग्रीगेट एंड CASE संस्करण:
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 फिडेल को डेमो के साथ देखें
स्तंभों को अलग-अलग पंक्तियों में परिवर्तित करके डेटा का UNION ALLप्रदर्शन करता है । फिर आप प्रत्येक के लिए नए कॉलम प्राप्त करने के लिए कथन के साथ कुल फ़ंक्शन लागू करते हैं ।UNPIVOTPaul, John, Tim, Ericsum()casecolor
बिना धुरी और धुरी स्थैतिक संस्करण:
SQL सर्वर में फ़ंक्शन UNPIVOTऔर PIVOTफ़ंक्शन दोनों इस परिवर्तन को बहुत आसान बनाते हैं। यदि आप उन सभी मूल्यों को जानते हैं जिन्हें आप बदलना चाहते हैं, तो आप परिणाम प्राप्त करने के लिए उन्हें एक स्थिर संस्करण में हार्ड-कोड कर सकते हैं:
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 फिडेल को डेमो के साथ देखें
आंतरिक क्वेरी के साथ UNPIVOTही कार्य करता है UNION ALL। यह स्तंभों की सूची लेता है और इसे पंक्तियों में बदल देता है, PIVOTफिर स्तंभों में अंतिम परिवर्तन करता है।
डायनामिक पिवट संस्करण:
यदि आपके पास अज्ञात कॉलम ( Paul, John, Tim, Ericआपके उदाहरण में) है और फिर रंग बदलने के लिए अज्ञात संख्या है तो आप डायनामिक sql का उपयोग सूची में UNPIVOTऔर फिर सूची बनाने के लिए कर सकते हैं 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, '+@colsPivot+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) src
pivot
(
sum(value)
for color in ('+@colsPivot+')
) piv'
exec(@query)
SQL फिडेल को डेमो के साथ देखें
गतिशील संस्करण दोनों प्रश्नों yourtableऔर फिर 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 |