Tỷ lệ của bạn ra 0% và không có gì sai về mặt cú pháp

Trung cấp 5 phút đọc Cập nhật 30/07/2026 UPA AI Partner

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.

✗ chia số nguyên✓ có thập phânbiểu thứckết quả3 / 403 * 100 / 475AVG(diem)7Mất hết phần thập phânbiểu thứckết quả3.0 / 40.75100.0 * 3 / 475.0AVG(diem::numeric)7.25Ép một vế sang số thực

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.0 thay vì 100 là 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 →