ऐसे कई तरीके हैं जिनसे आप इस डेटा को बदल सकते हैं। अपने मूल पोस्ट में, आपने कहा कि 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
प्रदर्शन करता है । फिर आप प्रत्येक के लिए नए कॉलम प्राप्त करने के लिए कथन के साथ कुल फ़ंक्शन लागू करते हैं ।UNPIVOT
Paul, John, Tim, Eric
sum()
case
color
बिना धुरी और धुरी स्थैतिक संस्करण:
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 |