Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

นับจำนวนด้วยเงื่อนไขใน MySQL: SUM(condition) แทน COUNT

นับเฉพาะแถวที่ตรงเงื่อนไข: ใช้ SUM(Expression) ไม่ใช่ COUNT

ใน MySQL เงื่อนไขเปรียบเทียบ (เช่น ClientName = 'Sam') จะคืนค่า 1 (TRUE) หรือ 0 (FALSE) ดังนั้น SUM(ClientName = 'Sam') จึงนับจำนวนแถวที่เป็น 'Sam' ได้โดยตรง

สร้างตารางและข้อมูล (มีค่าซ้ำและหลาย ClientId)

mysql> CREATE TABLE DemoTable1515 (
    -> ClientId VARCHAR(10),
    -> ClientName VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.53 sec)

mysql> INSERT INTO DemoTable1515 VALUES
    -> ('CLI-101', 'Chris'), ('CLI-110', 'David'), ('CLI-101', 'Bob'),
    -> ('CLI-101', 'Sam'), ('CLI-101', 'Sam'), ('CLI-101', 'Mike'),
    -> ('CLI-130', 'Mike'), ('CLI-101', 'Chris'), ('CLI-101', 'Sam');
Query OK, 9 rows affected

ข้อมูลทั้งหมด

+----------+------------+
| ClientId | ClientName |
+----------+------------+
| CLI-101  | Chris      |
| CLI-110  | David      |
| CLI-101  | Bob        |
| CLI-101  | Sam        |
| CLI-101  | Sam        |
| CLI-101  | Mike       |
| CLI-130  | Mike       |
| CLI-101  | Chris      |
| CLI-101  | Sam        |
+----------+------------+

คำสั่ง: นับ 'Sam' และนับทั้งหมด ใน ClientId = 'CLI-101'

mysql> SELECT ClientId,
    -> SUM(ClientName = 'Sam') AS NameOn101Id,
    -> COUNT(*) AS TotalNameOn101
    -> FROM DemoTable1515
    -> WHERE ClientId = 'CLI-101';

ผลลัพธ์

+----------+-------------+----------------+
| ClientId | NameOn101Id | TotalNameOn101 |
+----------+-------------+----------------+
| CLI-101  |           3 |              7 |
+----------+-------------+----------------+

คำอธิบาย

  • WHERE ClientId = 'CLI-101' - กรองแถวก่อน (เหลือ 7 แถว)
  • SUM(ClientName = 'Sam') - เงื่อนไขคืน 1/0, SUM รวมได้ 3 (เจอ Sam 3 ครั้ง)
  • COUNT(*) - นับแถวทั้งหมดในกลุ่ม = 7

เทคนิค Conditional Aggregation ทั่วไป

SELECT 
    ClientId,
    COUNT(*) AS total_rows,
    SUM(ClientName = 'Sam') AS count_sam,
    SUM(ClientName = 'Chris') AS count_chris,
    SUM(ClientName IN ('Sam', 'Chris')) AS count_sam_or_chris,
    SUM(ClientAge > 30) AS count_age_over_30,
    AVG(ClientAge) AS avg_age
FROM DemoTable1515
GROUP BY ClientId;

ข้อดีของ SUM(condition) vs COUNT(CASE...)

⚠️ หมายเหตุ: COUNT(column) vs COUNT(*)

  • COUNT(*) - นับทุกแถว (รวม NULL)
  • COUNT(column) - นับเฉพาะค่าที่ NOT NULL
  • SUM(column = 'value') - นับเฉพาะที่ Match เงื่อนไข (NULL = 0/False)
วิธีSyntaxข้อดี
SUM(condition)SUM(col = 'val')สั้น, อ่านง่าย, MySQL Specific
COUNT(CASE)COUNT(CASE WHEN col='val' THEN 1 END)ANSI Standard, Portable
SUM(CASE)SUM(CASE WHEN col='val' THEN 1 ELSE 0 END)Standard, ชัดเจน