Bài toán
Tính tỷ lệ giữa số lượng bản ghi thỏa mãn 2 điều kiện khác nhau (ví dụ: đã kết hôn vs chưa kết hôn).
Ví dụ
Tạo bảng:
CREATE TABLE DemoTable (isMarried TINYINT(1));
INSERT INTO DemoTable VALUES (1), (0), (1), (1), (1);
Dữ liệu: 4 người đã kết hôn (1), 1 người chưa (0).
Truy vấn tính tỷ lệ:
SELECT
(SELECT COUNT(*) FROM DemoTable WHERE isMarried = 1) /
(SELECT COUNT(*) FROM DemoTable WHERE isMarried = 0) AS divide
FROM dual;
Kết quả:
+--------+
| divide |
+--------+
| 4.0000 |
+--------+
Cách viết tối ưu hơn (single scan)
SELECT
SUM(CASE WHEN isMarried = 1 THEN 1 ELSE 0 END) /
SUM(CASE WHEN isMarried = 0 THEN 1 ELSE 0 END) AS ratio
FROM DemoTable;
Hoặc dùng COUNT với điều kiện (MySQL 8.0+):
SELECT
COUNT(CASE WHEN isMarried = 1 THEN 1 END) /
COUNT(CASE WHEN isMarried = 0 THEN 1 END) AS ratio
FROM DemoTable;
Xử lý chia cho 0
SELECT
CASE
WHEN married = 0 THEN NULL
ELSE single / married
END AS ratio
FROM (
SELECT
SUM(isMarried = 1) AS married,
SUM(isMarried = 0) AS single
FROM DemoTable
) AS t;
Lưu ý
- MySQL ép kiểu boolean thành số:
TRUE = 1,FALSE = 0. SUM(isMarried = 1)ngắn gọn hơnSUM(CASE...).- Luôn kiểm tra mẫu số = 0 để tránh lỗi division by zero.