Xuất dữ liệu ra Excel rồi mới phân loại là mất hai tiếng mỗi tuần. Làm ngay trong SQL mất bốn dòng.
Bài toán
Phân loại điểm thi thành Giỏi / Khá / Yếu. Không cần xuất Excel, không cần Python:
SELECT
id,
diem,
CASE
WHEN diem >= 85 THEN 'Giỏi'
WHEN diem >= 70 THEN 'Khá'
ELSE 'Yếu'
END AS xep_loai
FROM bai_thi;
Lỗi thường gặp
1. Sắp sai thứ tự điều kiện
CASE dừng lại ở điều kiện đúng đầu tiên. Viết ngược thứ tự là hỏng hết:
-- SAI: mọi điểm từ 70 trở lên đều thành 'Khá'
CASE
WHEN diem >= 70 THEN 'Khá'
WHEN diem >= 85 THEN 'Giỏi'
END
Điểm 92 khớp ngay dòng đầu và không bao giờ đi tới dòng thứ hai. Quy tắc: xếp từ điều kiện chặt nhất xuống rộng nhất.
2. Quên ELSE
Không có ELSE thì mọi dòng không khớp sẽ trả về NULL — và NULL lại làm hỏng COUNT, GROUP BY ở bước sau. Luôn viết ELSE.
3. So sánh với NULL
-- Không bao giờ đúng
CASE WHEN diem = NULL THEN 'Chưa thi' END
-- Đúng
CASE WHEN diem IS NULL THEN 'Chưa thi' END
Ba chỗ khác dùng được CASE
Trong ORDER BY — sắp xếp theo thứ tự tuỳ ý
ORDER BY CASE trang_thai
WHEN 'khan_cap' THEN 1
WHEN 'dang_xu_ly' THEN 2
ELSE 3
END;
Trong SUM — đếm có điều kiện
SELECT
COUNT(*) AS tong,
SUM(CASE WHEN diem >= 85 THEN 1 ELSE 0 END) AS so_gioi
FROM bai_thi;
Đây là kỹ thuật quan trọng nhất trong bài — nó là nền của mọi báo cáo xoay bảng.
Trong GROUP BY — gom theo nhóm tự định nghĩa
SELECT
CASE WHEN tuoi < 25 THEN '18-24'
WHEN tuoi < 35 THEN '25-34'
ELSE '35+' END AS nhom_tuoi,
COUNT(*)
FROM nguoi_dung
GROUP BY 1;
Luyện tập
- LeetCode 610 — Triangle Judgement
- LeetCode 1873 — Calculate Special Bonus
- LeetCode 627 — Swap Salary
- LeetCode 1179 — Reformat Department Table
- HackerRank — Type of Triangle
Tóm lại
CASEdừng ở điều kiện đúng đầu tiên — thứ tự quyết định kết quả.- Xếp từ chặt nhất xuống rộng nhất.
- Luôn có
ELSE, nếu không sẽ nhậnNULL. - Dùng
IS NULL, không dùng= NULL. SUM(CASE WHEN … THEN 1 ELSE 0 END)là nền của mọi báo cáo xoay bảng.
Bạn vừa học xong CASE WHEN
Sẵn sàng luyện tập chưa?
Làm bài tập CASE WHEN 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 →