MySQL में शर्तों के आधार पर गिनती करके परिणाम को अलग-अलग कॉलम में प्रदर्शित करने (पिवट/क्रॉस-टैब) के लिए SUM(CASE WHEN ... THEN 1 ELSE 0 END) पैटर्न का उपयोग करें। यह GROUP BY के साथ संयोजित करके पंक्तियों को कॉलम में बदल देता है।
सिंटैक्स
SELECT
group_column,
SUM(CASE WHEN condition1 THEN 1 ELSE 0 END) AS column1_count,
SUM(CASE WHEN condition2 THEN 1 ELSE 0 END) AS column2_count
FROM table_name
GROUP BY group_column;
व्यावहारिक उदाहरण
टेबल बनाएं:
mysql> CREATE TABLE DemoTable1485 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(20),
StudentSubject VARCHAR(20)
);
डेटा डालें (कुछ डुप्लिकेट नाम/विषय):
mysql> INSERT INTO DemoTable1485(StudentName, StudentSubject) VALUES('Chris', 'MySQL');
mysql> INSERT INTO DemoTable1485(StudentName, StudentSubject) VALUES('Robert', 'MongoDB');
mysql> INSERT INTO DemoTable1485(StudentName, StudentSubject) VALUES('Robert', 'MongoDB');
mysql> INSERT INTO DemoTable1485(StudentName, StudentSubject) VALUES('Chris', 'Java');
डेटा देखें:
mysql> SELECT * FROM DemoTable1485;
+-----------+-------------+----------------+ | StudentId | StudentName | StudentSubject | +-----------+-------------+----------------+ | 1 | Chris | MySQL | | 2 | Robert | MongoDB | | 3 | Robert | MongoDB | | 4 | Chris | Java | +-----------+-------------+----------------+
विषय के अनुसार प्रत्येक छात्र की गिनती (पिवट)
mysql> SELECT StudentSubject,
-> SUM(CASE WHEN StudentName = 'Chris' THEN 1 ELSE 0 END) AS Chris_Count,
-> SUM(CASE WHEN StudentName = 'Robert' THEN 1 ELSE 0 END) AS Robert_Count
-> FROM DemoTable1485
-> GROUP BY StudentSubject;
परिणाम
+----------------+-------------+--------------+ | StudentSubject | Chris_Count | Robert_Count | +----------------+-------------+--------------+ | MySQL | 1 | 0 | | MongoDB | 0 | 2 | | Java | 1 | 0 | +----------------+-------------+--------------+
कैसे काम करता है
GROUP BY StudentSubject- प्रत्येक विषय के लिए एक पंक्ति बनाता हैCASE WHEN StudentName = 'Chris' THEN 1 ELSE 0 END- क्रिस की पंक्तियों के लिए 1, अन्य के लिए 0SUM(...)- उन 1s को जोड़ता है = क्रिस की गिनती- प्रत्येक छात्र के लिए एक कॉलम बन जाता है
सामान्य पैटर्न: गतिशील मानों के लिए
यदि छात्र नाम पहले से ज्ञात नहीं हैं, तो एप्लिकेशन कोड में डायनामिक SQL जनरेट करें या MySQL 8.0+ में JSON_OBJECTAGG उपयोग करें:
SELECT StudentSubject,
JSON_OBJECTAGG(StudentName, cnt) AS counts
FROM (
SELECT StudentSubject, StudentName, COUNT(*) AS cnt
FROM DemoTable1485
GROUP BY StudentSubject, StudentName
) t
GROUP BY StudentSubject;
अन्य एग्रीगेट फ़ंक्शन के साथ
SELECT
department,
SUM(CASE WHEN gender = 'M' THEN salary ELSE 0 END) AS male_salary_sum,
SUM(CASE WHEN gender = 'F' THEN salary ELSE 0 END) AS female_salary_sum,
AVG(CASE WHEN gender = 'M' THEN salary END) AS male_avg_salary
FROM employees
GROUP BY department;
नोट: AVG में ELSE NULL (डिफ़ॉल्ट) मिलान न होने पर पंक्ति को अनदेखा करता है।
पिवट बनाम GROUP BY
| पारंपरिक GROUP BY | पिवट (CASE SUM) |
|---|---|
| पंक्तियां: विषय, छात्र, गिनती | पंक्तियां: विषय, कॉलम: प्रत्येक छात्र की गिनती |
| लंबा फॉर्मेट | चौड़ा फॉर्मेट (रिपोर्टिंग के लिए बेहतर) |
| डायनामिक मान आसान | स्थिर कॉलम के लिए बेहतर |
उपयोग के मामले
- बिक्री रिपोर्ट: उत्पाद × क्षेत्र मैट्रिक्स
- उपस्थिति: छात्र × माह
- सर्वेक्षण: प्रश्न × विकल्प गिनती
- लॉग विश्लेषण: त्रुटि प्रकार × सर्वर
SUM(CASE...) पैटर्न MySQL में पिवट टेबल बनाने का मानक, पोर्टेबल तरीका है (किसी विशेष PIVOT सिंटैक्स की आवश्यकता नहीं)।