MySQL में GROUP_CONCAT और SUM के साथ पंक्तियों को एक पंक्ति में संयोजित करना
MySQL का GROUP_CONCAT() फ़ंक्शन एक समूह के भीतर गैर-NULL मानों को एक स्ट्रिंग में जोड़ता है, और SUM() संख्यात्मक मानों को जोड़ता है। साथ में वे कई पंक्तियों को एक सारांश पंक्ति में संक्षिप्त करने की अनुमति देते हैं।
टेबल बनाना
mysql> CREATE TABLE DemoTable1960 (
-> StudentId INT,
-> StudentName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.00 sec)
डेटा डालना
mysql> INSERT INTO DemoTable1960 VALUES (100, 'Chris');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1960 VALUES (101, 'Bob');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1960 VALUES (102, 'David');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1960 VALUES (103, 'Mike');
Query OK, 1 row affected (0.00 sec)
सभी रिकॉर्ड्स देखना
mysql> SELECT * FROM DemoTable1960;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 100 | Chris |
| 101 | Bob |
| 102 | David |
| 103 | Mike |
+-----------+-------------+
4 rows in set (0.00 sec)
नामों को संयोजित करने और ID का योग करने का क्वेरी
mysql> SELECT
-> SUM(StudentId) AS TotalIdSum,
-> GROUP_CONCAT(StudentName SEPARATOR '.') AS ListOfStudents
-> FROM DemoTable1960;
परिणाम
+----------------+----------------------+
| TotalIdSum | ListOfStudents |
+----------------+----------------------+
| 406 | Chris.Bob.David.Mike |
+----------------+----------------------+
1 row in set (0.00 sec)
GROUP_CONCAT सिंटैक्स और विकल्प
GROUP_CONCAT(
[DISTINCT] expr
[ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC]]
[SEPARATOR str_val]
)
महत्वपूर्ण विकल्प
| विकल्प | विवरण | डिफ़ॉल्ट |
|---|---|---|
| DISTINCT | डुप्लिकेट मान हटाता है | नहीं |
| ORDER BY | संयोजन क्रम निर्दिष्ट करता है | समूह क्रम |
| SEPARATOR | विभाजक स्ट्रिंग | ',' (कॉमा) |
GROUP_CONCAT उदाहरण
-- डिफ़ॉल्ट कॉमा विभाजक
GROUP_CONCAT(StudentName) -- 'Chris,Bob,David,Mike'
-- कस्टम विभाजक
GROUP_CONCAT(StudentName SEPARATOR ' | ') -- 'Chris | Bob | David | Mike'
-- क्रमबद्ध संयोजन
GROUP_CONCAT(StudentName ORDER BY StudentName SEPARATOR ', ') -- 'Bob, Chris, David, Mike'
-- अद्वितीय मान
GROUP_CONCAT(DISTINCT StudentName SEPARATOR ', ')
-- लंबाई सीमा (डिफ़ॉल्ट 1024 बाइट्स)
SET SESSION group_concat_max_len = 10000;
GROUP BY के साथ उपयोग
-- विभाग के अनुसार समूहित
SELECT
Department,
COUNT(*) AS EmpCount,
SUM(Salary) AS TotalSalary,
GROUP_CONCAT(EmployeeName ORDER BY EmployeeName SEPARATOR ', ') AS Employees
FROM Employees
GROUP BY Department;
संयोजन के साथ सशर्त तर्क
SELECT
GROUP_CONCAT(
CASE WHEN Score >= 80 THEN CONCAT(Name, '(A)')
ELSE CONCAT(Name, '(B)') END
ORDER BY Score DESC SEPARATOR '; '
) AS GradedStudents
FROM Students;
सीमाएं और समाधान
- अधिकतम लंबाई:
group_concat_max_lenसत्र/सिस्टम चर द्वारा नियंत्रित (डिफ़ॉल्ट 1024) - NULL मान: स्वचालित रूप से छोड़ दिए जाते हैं
- बड़े परिणाम: बहुत बड़े संयोजन के लिए एप्लिकेशन-स्तरीय प्रसंस्करण पर विचार करें
विंडो फ़ंक्शन विकल्प (MySQL 8.0+)
SELECT DISTINCT
SUM(StudentId) OVER () AS TotalIdSum,
GROUP_CONCAT(StudentName ORDER BY StudentId SEPARATOR '.') OVER () AS ListOfStudents
FROM DemoTable1960
LIMIT 1;
व्यावहारिक उपयोग मामले
- रिपोर्टिंग: संबंधित आइटम्स की कॉमा-अलग सूची उत्पन्न करना
- ईमेल सूचियाँ: प्राप्तकर्ताओं को एक स्ट्रिंग में संयोजित करना
- टैग क्लाउड: लेख टैग्स को संयोजित करना
- ऑडिट ट्रेल: परिवर्तनों का सारांश बनाना
- डेटा निर्यात: CSV/JSON-जैसा आउटपुट उत्पन्न करना