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

मेरी क्वेरी के साथ तालिका पिवट नहीं कर सकता?

अन्य उत्तरों पर विस्तार करने के लिए, 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. .NET में SQL टाइमस्टैम्प की तुलना कैसे करें?

  2. क्या SQL सर्वर 2005 डेटाटाइम2 का समर्थन करता है?

  3. UTF8 समस्या sql सर्वर

  4. SQL सर्वर में एक पहचान कॉलम में मान कैसे सम्मिलित करें

  5. SQL सर्वर (T-SQL) में कॉलम का डेटा प्रकार प्राप्त करने के 3 तरीके