MySQL में CASE और SUM के साथ पिवट-स्टाइल एग्रीगेशन
जब आपको एक कॉलम के अलग-अलग मानों की गिनती या योग को अलग-अलग कॉलम के रूप में दिखाना हो (पिवट टेबल की तरह), तो CASE के साथ SUM() या COUNT() का उपयोग करें।
उदाहरण: उत्पाद रेटिंग की गिनती
टेबल बनाएं:
CREATE TABLE DemoTable (
ProductName VARCHAR(100),
ProductRating ENUM('1', '2', '3')
);
INSERT INTO DemoTable VALUES
('Product-1', 3), ('Product-2', 1), ('Product-3', 2),
('Product-1', 2), ('Product-3', 3), ('Product-2', 2), ('Product-3', 3);
डेटा:
+-------------+---------------+ | ProductName | ProductRating | +-------------+---------------+ | Product-1 | 3 | | Product-2 | 1 | | Product-3 | 2 | | Product-1 | 2 | | Product-3 | 3 | | Product-2 | 2 | | Product-3 | 3 | +-------------+---------------+
प्रत्येक उत्पाद के लिए रेटिंग 1, 2, 3 की गिनती
SELECT
ProductName,
SUM(CASE WHEN ProductRating = '3' THEN 1 ELSE 0 END) AS Rating_3_Count,
SUM(CASE WHEN ProductRating = '2' THEN 1 ELSE 0 END) AS Rating_2_Count,
SUM(CASE WHEN ProductRating = '1' THEN 1 ELSE 0 END) AS Rating_1_Count
FROM DemoTable
GROUP BY ProductName;
परिणाम:
+-------------+----------------+----------------+----------------+ | ProductName | Rating_3_Count | Rating_2_Count | Rating_1_Count | +-------------+----------------+----------------+----------------+ | Product-1 | 1 | 1 | 0 | | Product-2 | 0 | 1 | 1 | | Product-3 | 2 | 1 | 0 | +-------------+----------------+----------------+----------------+
व्याख्या
CASE WHEN ProductRating = '3' THEN 1 ELSE 0 END— रेटिंग 3 के लिए 1, अन्यथा 0SUM()— इन 1 और 0 को जोड़कर गिनती देता हैGROUP BY ProductName— प्रत्येक उत्पाद के लिए अलग पंक्ति
आधुनिक विकल्प: FILTER क्लॉज (MySQL 8.0+)
SELECT
ProductName,
COUNT(*) FILTER (WHERE ProductRating = '3') AS Rating_3_Count,
COUNT(*) FILTER (WHERE ProductRating = '2') AS Rating_2_Count,
COUNT(*) FILTER (WHERE ProductRating = '1') AS Rating_1_Count
FROM DemoTable
GROUP BY ProductName;
FILTER क्लॉज अधिक पठनीय और मानक SQL है।