Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में CASE WHEN और SUM से शर्ती गिनती को अलग कॉलम में प्रदर्शित करें (पिवट)

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            |
+----------------+-------------+--------------+

कैसे काम करता है

  1. GROUP BY StudentSubject - प्रत्येक विषय के लिए एक पंक्ति बनाता है
  2. CASE WHEN StudentName = 'Chris' THEN 1 ELSE 0 END - क्रिस की पंक्तियों के लिए 1, अन्य के लिए 0
  3. SUM(...) - उन 1s को जोड़ता है = क्रिस की गिनती
  4. प्रत्येक छात्र के लिए एक कॉलम बन जाता है

सामान्य पैटर्न: गतिशील मानों के लिए

यदि छात्र नाम पहले से ज्ञात नहीं हैं, तो एप्लिकेशन कोड में डायनामिक 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 सिंटैक्स की आवश्यकता नहीं)।

  1. - MySQL में कॉलम मानों को अलग टेक्स्ट के साथ जोड़ें और एकल कॉलम में प्रदर्शित करें

    आइए पहले एक टेबल बनाते हैं: mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.93 sec) इन्सर्ट कमांड का उपयोग करके टेबल में कुछ रिकॉर्ड डालें: mysql> insert into DemoTable values(101,Chris); Query OK, 1 row affected (0.25 sec) mysq

  1. - MySQL में 0 या 1 मान वाले कॉलम के लिए शर्तें सेट करें

    शर्तें सेट करने के लिए MySQL में CASE WHEN स्टेटमेंट का उपयोग करें। आइए पहले एक टेबल बनाते हैं: mysql> create table DemoTable -> ( -> Value1 int, -> Value2 int, -> Value3 int, -> Value4 int -> ); Query OK, 0 rows affected (0.98 sec) इन्सर्ट कमांड का उपयोग करके टेबल में कुछ रिकॉ

  1. - MySQL में GROUP_CONCAT और CASE से अलग शर्तों वाले समान कॉलम के मान जोड़ें

    एक ही कॉलम (Name) की अलग-अलग शर्तों (Subject) के मानों को जोड़ने के लिए CASE के साथ सशर्त एग्रीगेशन और CONCAT या GROUP_CONCAT का उपयोग करें। टेबल बनाएं mysql> CREATE TABLE DemoTable1869 ( Id INT, Subject VARCHAR(20), Name VARCHAR(20) ); डेटा डालें mysql> INSERT INTO DemoTable1869 VALUES(