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