Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Có thể dùng SUM() với IF() trong MySQL không?

Có. Kết hợp SUM() với IF() để đếm điều kiện (conditional counting) trong một truy vấn.

Tạo bảng demo

mysql> CREATE TABLE DemoTable (Value INT, Value2 INT);

Chèn dữ liệu

mysql> INSERT INTO DemoTable VALUES(100, 400);
mysql> INSERT INTO DemoTable VALUES(100, 400);
mysql> INSERT INTO DemoTable VALUES(400, 100);

Xem dữ liệu

mysql> SELECT * FROM DemoTable;
+-------+--------+
| Value | Value2 |
+-------+--------+
| 100   | 400    |
| 100   | 400    |
| 400   | 100    |
+-------+--------+

Đếm số lần xuất hiện 100 và 400 trên cả 2 cột

mysql> SELECT 
    -> SUM(IF(Value = 100, 1, 0) + IF(Value2 = 100, 1, 0)) AS Hundred,
    -> SUM(IF(Value = 400, 1, 0) + IF(Value2 = 400, 1, 0)) AS FourHundred
    -> FROM DemoTable;
+---------+--------------+
| Hundred | FourHundred  |
+---------+--------------+
| 3       | 3            |
+---------+--------------+

Phân tích

  • Hàng 1: Value=100 (+1), Value2=400 (+1 cho 400)
  • Hàng 2: Value=100 (+1), Value2=400 (+1 cho 400)
  • Hàng 3: Value=400 (+1 cho 400), Value2=100 (+1 cho 100)
  • Tổng: 100 xuất hiện 3 lần, 400 xuất hiện 3 lần

Cách viết chuẩn hơn: CASE WHEN

IF() là MySQL-specific. Chuẩn SQL dùng CASE WHEN:

SELECT 
    SUM(CASE WHEN Value = 100 THEN 1 ELSE 0 END + CASE WHEN Value2 = 100 THEN 1 ELSE 0 END) AS Hundred,
    SUM(CASE WHEN Value = 400 THEN 1 ELSE 0 END + CASE WHEN Value2 = 400 THEN 1 ELSE 0 END) AS FourHundred
FROM DemoTable;

Mở rộng: Pivot table (crosstab)

SELECT 
    SUM(CASE WHEN Value IN (100, 400) THEN 1 ELSE 0 END) AS Total_Count,
    SUM(CASE WHEN Value = 100 THEN 1 ELSE 0 END) AS Count_100,
    SUM(CASE WHEN Value = 400 THEN 1 ELSE 0 END) AS Count_400
FROM DemoTable;

Hiệu năng

  • SUM(IF(...)) quét toàn bảng một lần — hiệu quả
  • Tránh chạy nhiều COUNT(*) WHERE ... riêng lẻ (quét bảng nhiều lần)
  • Có thể thêm index trên cột Value/Value2 nếu lọc thường xuyên