अन्य उत्तरों पर विस्तार करने के लिए, PIVOT फ़ंक्शन को कुछ प्रकार के एकत्रीकरण की आवश्यकता होती है। चूंकि आप जिस मान को एक पंक्ति से एक कॉलम में बदलना चाहते हैं, वह एक स्ट्रिंग है, तो आप या तो max()
का उपयोग करने तक सीमित हैं या min()
कुल कार्य।
जबकि @Muhammed Ali's
उत्तर तब काम करेगा जब आपके पास एक ही AttributeName
होगा /AttributeValue
जोड़ी, यदि आपके पास प्रत्येक ID
. के लिए एकाधिक जोड़े हैं , तो आप या तो केवल max
. लौटाएंगे या min
मूल्य।
उदाहरण के लिए यदि आपका नमूना डेटा है:
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');
INSERT INTO @MyTable VALUES ('A1', 'Atr2', 'A1V2');
INSERT INTO @MyTable VALUES ('A1', 'Atr3', 'A1V3');
INSERT INTO @MyTable VALUES ('A2', 'Atr1', 'A2V1');
INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');
INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3');
भले ही आपके पास A1
. के संयोजन के लिए कई पंक्तियाँ हों और Atr1
, अन्य प्रश्न केवल max(attributevalue)
. लौटा रहे हैं :
| ID | ATR1 | ATR2 | ATR3 |
|----|------|------|------|
| A1 | A1V4 | A1V2 | A1V3 |
| A2 | A2V1 | A2V2 | A3V3 |
मुझे लगता है कि आप वास्तव में सभी संयोजनों को वापस करना चाहेंगे। मैं विंडोिंग फ़ंक्शन, row_number()
. को शामिल करने के लिए आपकी क्वेरी का विस्तार करने का सुझाव देता हूं आपकी क्वेरी में। यह क्वेरी एक अद्वितीय मान उत्पन्न करती है जिसे तब PIVOT के समूहीकरण पहलू में शामिल किया जाएगा और आपको प्रत्येक आईडी के लिए एक से अधिक पंक्ति वापस करने की अनुमति देगा।
row_number()
. जोड़कर , क्वेरी निम्न के समान होगी:
SELECT Id, [Atr1], [Atr2],[Atr3]
FROM
(
SELECT ID, AttributeName, AttributeValue,
row_number() over(partition by id, attributename
order by attributevalue) seq
FROM @MyTable
) AS SourceTable
PIVOT
(
max(AttributeValue)
FOR AttributeName IN ([ATR1], [ATR2], [ATR3])
) AS pvt
order by id;
देखें SQL Fiddle with Demo . आपको एक परिणाम मिलेगा जो सभी पंक्तियों को लौटाएगा:
| ID | ATR1 | ATR2 | ATR3 |
|----|------|--------|--------|
| A1 | A1V1 | A1V2 | A1V3 |
| A1 | A1V4 | (null) | (null) |
| A2 | A2V1 | A2V2 | A3V3 |
यदि आपको PIVOT की अवधारणा को समझने में परेशानी हो रही है, तो मैं सुझाव दूंगा कि परिणाम प्राप्त करने के लिए CASE अभिव्यक्ति के साथ एक समग्र फ़ंक्शन के संयोजन का उपयोग करें। फिर आप अनुक्रम/आईडी का समूहीकरण देख सकते हैं:
SELECT Id,
max(case when attributename = 'Atr1' then attributevalue end) Atr1,
max(case when attributename = 'Atr2' then attributevalue end) Atr2,
max(case when attributename = 'Atr3' then attributevalue end) Atr3
FROM
(
SELECT ID, AttributeName, AttributeValue,
row_number() over(partition by id, attributename
order by attributevalue) seq
FROM @MyTable
) AS SourceTable
group by id, seq
देखें SQL Fiddle with Demo