Tỷ lệ chuyển đổi hiện 0%. Dữ liệu đúng, công thức đúng. Sai ở chỗ SQL coi 3 chia 4 bằng 0.
Bài toán
3 trong 4 người đăng ký đã kích hoạt. Tỷ lệ phải là 75%. Truy vấn trả về 0.
Nguyên nhân
Trong SQL, số nguyên chia số nguyên cho ra số nguyên. Phần thập phân bị cắt bỏ, không làm tròn. 3 / 4 ra 0, 7 / 2 ra 3.
PostgreSQL, SQL Server và MySQL đều hành xử như vậy. Không có cảnh báo nào.
Ba cách sửa
-- 1. Nhân 100.0 trước khi chia (gọn nhất)
SELECT 100.0 * so_kich_hoat / so_dang_ky FROM thong_ke;
-- 2. Ép kiểu tường minh
SELECT CAST(so_kich_hoat AS DECIMAL) / so_dang_ky FROM thong_ke;
-- 3. PostgreSQL: cú pháp ngắn
SELECT so_kich_hoat::numeric / so_dang_ky FROM thong_ke;
Mẹo nhớ
Chỉ cần một vế là số thực thì cả phép tính thành số thực. Viết
100.0 thay vì 100 là đủ.
Lỗi thường gặp
1. Ép kiểu sau khi đã chia
-- Vẫn ra 0: chia trước rồi mới ép
SELECT CAST(3 / 4 AS DECIMAL);
-- Đúng: ép trước
SELECT CAST(3 AS DECIMAL) / 4;
2. Quên mẫu số bằng 0
-- Lỗi "division by zero" làm hỏng cả báo cáo
SELECT so_kich_hoat / so_dang_ky FROM thong_ke;
-- An toàn
SELECT ROUND(100.0 * so_kich_hoat / NULLIF(so_dang_ky, 0), 1) FROM thong_ke;
Muốn hiện 0 thay vì để trống thì bọc thêm COALESCE(..., 0).
3. Làm tròn sai vị trí
-- Làm tròn từng dòng rồi mới cộng: sai số tích luỹ
SUM(ROUND(gia * so_luong, 2))
-- Cộng rồi mới làm tròn
ROUND(SUM(gia * so_luong), 2)
4. Nhầm tỷ lệ trên tổng với trung bình của các tỷ lệ
-- SAI: mỗi thành phố có trọng số như nhau dù to nhỏ khác nhau
AVG(ty_le_thanh_pho)
-- ĐÚNG: tỷ lệ trên toàn bộ
100.0 * SUM(so_kich_hoat) / SUM(so_dang_ky)
Đây là lỗi khiến báo cáo tổng hợp không khớp với báo cáo chi tiết, và rất khó phát hiện.
Luyện tập
- LeetCode 1211 — Queries Quality and Percentage
- LeetCode 1934 — Confirmation Rate
- LeetCode 262 — Trips and Users
- LeetCode 1174 — Immediate Food Delivery II
- HackerRank — The Blunder
Tóm lại
- Số nguyên chia số nguyên cho ra số nguyên, phần dư bị cắt.
- Viết
100.0thay vì100là cách sửa gọn nhất. - Ép kiểu trước khi chia, không phải sau.
- Luôn bọc mẫu số bằng
NULLIF(x, 0). - Tỷ lệ trên tổng khác trung bình của các tỷ lệ.
Bạn vừa học xong tỷ lệ phần trăm
Sẵn sàng luyện tập chưa?
Làm bài tập tỷ lệ phần trăm trên dữ liệu thật, chấm điểm ngay khi bạn bấm chạy.
Bắt đầu luyện tập →