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

Đếm 2 tập dòng khác nhau và chia tỷ lệ trong MySQL

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ơn SUM(CASE...).
  • Luôn kiểm tra mẫu số = 0 để tránh lỗi division by zero.