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

MySQL: นับค่าที่ปรากฏในหลายคอลัมน์ด้วย CASE SUM

การนับจำนวนครั้งที่ค่าเฉพาะปรากฏในหลายคอลัมน์รวมกัน

ใช้ SUM(CASE WHEN col = value THEN 1 ELSE 0 END) สำหรับแต่ละคอลัมน์ แล้วนำมาบวกกัน จะได้จำนวนรวมที่ค่านั้นปรากฏในทุกคอลัมน์ที่สนใจ

ตัวอย่างการใช้งาน

สร้างตาราง 3 คอลัมน์ตัวเลข:

mysql> CREATE TABLE countValueMultipleColumnsDemo (
    -> Value1 INT, Value2 INT, Value3 INT
    -> );
Query OK, 0 rows affected (0.62 sec)

mysql> INSERT INTO countValueMultipleColumnsDemo VALUES(10,15,10), (20,30,10), (40,10,60);
Query OK, 3 rows affected (0.15 sec)

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

mysql> SELECT * FROM countValueMultipleColumnsDemo;
+--------+--------+--------+
| Value1 | Value2 | Value3 |
+--------+--------+--------+
| 10     | 15     | 10     |
| 20     | 30     | 10     |
| 40     | 10     | 60     |
+--------+--------+--------+
3 rows in set (0.00 sec)

นับจำนวนรวมของค่า 10 ในทุกคอลัมน์:

mysql> SELECT 
    ->     SUM(CASE WHEN Value1 = 10 THEN 1 ELSE 0 END) +
    ->     SUM(CASE WHEN Value2 = 10 THEN 1 ELSE 0 END) +
    ->     SUM(CASE WHEN Value3 = 10 THEN 1 ELSE 0 END) AS TOTAL_COUNT
    -> FROM countValueMultipleColumnsDemo;
+-------------+
| TOTAL_COUNT |
+-------------+
| 4           |
+-------------+
1 row in set (0.00 sec)

คำอธิบายการนับ

  • Value1=10: แถวที่ 1 → 1 ครั้ง
  • Value2=10: แถวที่ 3 → 1 ครั้ง
  • Value3=10: แถวที่ 1, 2 → 2 ครั้ง
  • รวม = 1 + 1 + 2 = 4

วิธีเขียนสั้นกว่า (MySQL 8.0+)

SELECT 
    (Value1 = 10) + (Value2 = 10) + (Value3 = 10) AS row_count
FROM countValueMultipleColumnsDemo;
-- คืนค่าต่อแถว แล้วค่อย SUM() รวม

หรือ Unpivot แล้ว Count (มาตรฐานกว่า):

SELECT COUNT(*) FROM (
    SELECT Value1 AS val FROM countValueMultipleColumnsDemo
    UNION ALL SELECT Value2 FROM countValueMultipleColumnsDemo
    UNION ALL SELECT Value3 FROM countValueMultipleColumnsDemo
) AS all_values
WHERE val = 10;

ประยุกต์: นับหลายค่าพร้อมกัน

SELECT 
    SUM(CASE WHEN Value1 IN (10,20) THEN 1 ELSE 0 END) +
    SUM(CASE WHEN Value2 IN (10,20) THEN 1 ELSE 0 END) +
    SUM(CASE WHEN Value3 IN (10,20) THEN 1 ELSE 0 END) AS count_10_or_20
FROM countValueMultipleColumnsDemo;

วิธี CASE SUM ยืดหยุ่น สามารถนับเงื่อนไขซับซ้อนได้ ไม่จำกัดแค่เท่ากับค่าคงที่