MySQL में CASE स्टेटमेंट का उपयोग करके पंक्तियों को कॉलम में बदलना (Pivot)
आप CASE स्टेटमेंट और एग्रीगेट फ़ंक्शन का उपयोग करके कॉलम मानों को कॉलम नामों में बदल सकते हैं।
सिंटैक्स
SELECT yourIdColumnName,
MAX(CASE WHEN yourColumnName1 = 'value1' THEN yourColumnName2 ELSE NULL END) AS 'value1',
MAX(CASE WHEN yourColumnName1 = 'value2' THEN yourColumnName2 ELSE NULL END) AS 'value2',
...
FROM yourTableName
GROUP BY yourIdColumnName
ORDER BY yourIdColumnName;
उदाहरण
टेबल बनाएं:
mysql> create table valueAsColumn (
-> UserId int,
-> UserColumn1 varchar(10),
-> UserColumn2 varchar(10)
-> );
डेटा डालें:
mysql> insert into valueAsColumn values(0, 'John', 'A+'); mysql> insert into valueAsColumn values(0, 'Carol', 'B'); mysql> insert into valueAsColumn values(0, 'Sam', 'C'); mysql> insert into valueAsColumn values(1, 'John', 'D'); mysql> insert into valueAsColumn values(1, 'Carol', 'A'); mysql> insert into valueAsColumn values(1, 'Carol', 'C');
पिवट क्वेरी:
mysql> select UserId,
-> max(case when (UserColumn1 = 'John') then UserColumn2 else NULL end) as 'John',
-> max(case when (UserColumn1 = 'Carol') then UserColumn2 else NULL end) as 'Carol',
-> max(case when (UserColumn1 = 'Sam') then UserColumn2 else NULL end) as 'Sam'
-> from valueAsColumn
-> group by UserId
-> order by UserId;
परिणाम:
+--------+------+-------+------+ | UserId | John | Carol | Sam | +--------+------+-------+------+ | 0 | A+ | B | C | | 1 | D | C | NULL | +--------+------+-------+------+
व्याख्या
CASE WHEN UserColumn1 = 'John' THEN UserColumn2: John के लिए UserColumn2 मानMAX(...): एकाधिक मान होने पर अधिकतम लेता है (या कोई भी एग्रीगेट)GROUP BY UserId: प्रत्येक UserId के लिए एक पंक्ति
डायनामिक पिवट (MySQL 8.0+)
ज्ञात मानों के लिए उपरोक्त विधि काम करती है। अज्ञात/डायनामिक मानों के लिए तैयार स्टेटमेंट या एप्लिकेशन कोड में पिवट करें।