समाधान: GROUP BY में एकाधिक कॉलम
MySQL में एकाधिक कॉलम द्वारा समूह बनाने के लिए GROUP BY col1, col2, ... का उपयोग करें। IF() फ़ंक्शन का उपयोग सशर्त एग्रीगेशन के लिए किया जा सकता है।
व्यावहारिक उदाहरण
टेबल बनाना और डेटा डालना
mysql> CREATE TABLE MultipleGroupByDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CustomerId INT,
-> ProductName VARCHAR(100)
-> );
mysql> INSERT INTO MultipleGroupByDemo(CustomerId, ProductName) VALUES
-> (1000, 'Product-1'),
-> (1001, 'Product-2'), (1001, 'Product-2'), (1001, 'Product-2'),
-> (1002, 'Product-3'), (1002, 'Product-3'),
-> (1003, 'Product-4');
मूल डेटा (7 पंक्तियाँ)
| Id | CustomerId | ProductName |
| 1 | 1000 | Product-1 |
| 2 | 1001 | Product-2 |
| 3 | 1001 | Product-2 |
| 4 | 1001 | Product-2 |
| 5 | 1002 | Product-3 |
| 6 | 1002 | Product-3 |
| 7 | 1003 | Product-4 |
क्वेरी 1: ProductName, CustomerId द्वारा GROUP BY के साथ IF
mysql> SELECT CustomerId, IF(ProductName = 'Product-2', 1, 0)
-> FROM MultipleGroupByDemo
-> GROUP BY ProductName, CustomerId;
परिणाम
| CustomerId | IF(ProductName = 'Product-2', 1, 0) |
| 1000 | 0 |
| 1001 | 1 |
| 1002 | 0 |
| 1003 | 0 |
क्वेरी 2: CustomerId द्वारा GROUP BY के साथ MAX(IF())
mysql> SELECT CustomerId, MAX(IF(ProductName = 'Product-2', 1, 0))
-> FROM MultipleGroupByDemo
-> GROUP BY CustomerId;
परिणाम
| CustomerId | MAX(IF(ProductName = 'Product-2', 1, 0)) |
| 1000 | 0 |
| 1001 | 1 |
| 1002 | 0 |
| 1003 | 0 |
व्याख्या
- क्वेरी 1: ProductName, CustomerId जोड़े द्वारा समूह - प्रत्येक अद्वितीय संयोजन के लिए एक पंक्ति
- क्वेरी 2: केवल CustomerId द्वारा समूह - प्रत्येक ग्राहक के लिए एक पंक्ति, MAX यह जांचता है कि क्या उस ग्राहक के पास Product-2 है
IF(condition, 1, 0) बूलियन को 1/0 में बदलता है
MAX() किसी भी 1 को ढूंढता है (यदि कम से कम एक Product-2 है तो 1)
सशर्त एग्रीगेशन पैटर्न
SELECT
CustomerId,
SUM(IF(ProductName = 'Product-1', 1, 0)) AS product1_count,
SUM(IF(ProductName = 'Product-2', 1, 0)) AS product2_count,
SUM(IF(ProductName = 'Product-3', 1, 0)) AS product3_count,
COUNT(*) AS total_orders
FROM MultipleGroupByDemo
GROUP BY CustomerId;
आधुनिक SQL (MySQL 8.0+): FILTER क्लॉज
SELECT
CustomerId,
COUNT(*) FILTER (WHERE ProductName = 'Product-2') AS product2_count
FROM MultipleGroupByDemo
GROUP BY CustomerId;
GROUP BY एकाधिक कॉलम - नियम
- SELECT सूची में सभी गैर-एग्रीगेट कॉलम GROUP BY में होने चाहिए
- क्रम मायने रखता है: GROUP BY a, b, c
- फंक्शनल डिपेंडेंसी (ONLY_FULL_GROUP_BY मोड) का पालन किया जाता है