GROUP BY Và Hàm Tổng Hợp Trong SQL: COUNT, SUM, AVG, MIN, MAX
Chia sẻ
"Học cách nhóm dữ liệu và tính toán thống kê với GROUP BY, HAVING. Kèm các hàm tổng hợp COUNT, SUM, AVG, MIN, MAX và ví dụ thực tế trong phân tích dữ liệu."
1. GROUP BY Là Gì?
GROUP BY gom các dòng có giá trị giống nhau thành 1 nhóm, kết hợp với hàm tổng hợp (aggregate functions) để tính toán trên mỗi nhóm. Đây là câu lệnh được dùng nhiều nhất trong SQL analytics — từ đếm đơn hàng theo tháng đến tính doanh thu theo vùng.
2. Các Hàm Tổng Hợp Cơ Bản
5 hàm tổng hợp cốt lõi: COUNT() đếm số dòng, SUM() tính tổng, AVG() tính trung bình, MIN() tìm giá trị nhỏ nhất, MAX() tìm giá trị lớn nhất. Tất cả đều bỏ qua NULL trừ COUNT(*).
SELECT
category,
COUNT(*) AS total_orders, -- Đếm tất cả dòng
COUNT(discount) AS discounted, -- Đếm dòng có discount (bỏ NULL)
SUM(amount) AS total_revenue,
AVG(amount) AS avg_order_value,
MIN(amount) AS smallest_order,
MAX(amount) AS largest_order
FROM orders
GROUP BY category;3. GROUP BY Nhiều Cột
GROUP BY có thể gom theo nhiều cột cùng lúc. Thứ tự các cột tạo thành hierarchy: nhóm to → nhóm nhỏ. Tất cả cột trong SELECT không nằm trong aggregate function PHẢI có trong GROUP BY.
-- Doanh thu theo năm + quý + vùng
SELECT
YEAR(order_date) AS year,
QUARTER(order_date) AS quarter,
region,
SUM(amount) AS revenue
FROM orders
GROUP BY YEAR(order_date), QUARTER(order_date), region
ORDER BY year, quarter, region;4. HAVING — Lọc Sau Khi GROUP
WHERE lọc dòng TRƯỚC khi group, HAVING lọc nhóm SAU khi group. HAVING cần thiết khi muốn lọc theo kết quả aggregate — ví dụ chỉ lấy category có doanh thu > 1 triệu.
-- Category có doanh thu > 1 triệu VÀ ≥ 100 đơn
SELECT
category,
SUM(amount) AS total_revenue,
COUNT(*) AS order_count
FROM orders
WHERE status = 'completed' -- WHERE lọc trước
GROUP BY category
HAVING SUM(amount) > 1000000 -- HAVING lọc sau
AND COUNT(*) >= 100
ORDER BY total_revenue DESC;5. GROUP BY ROLLUP Và CUBE
ROLLUP tạo subtotal tự động theo hierarchy. CUBE tạo subtotal cho TẤT CẢ tổ hợp. Rất hữu ích khi tạo báo cáo tổng hợp mà không cần UNION ALL nhiều queries.
-- ROLLUP: subtotal theo year → quarter → total
SELECT
COALESCE(CAST(YEAR(order_date) AS VARCHAR), 'Total') AS year,
COALESCE(CAST(QUARTER(order_date) AS VARCHAR), 'Subtotal') AS quarter,
SUM(amount) AS revenue
FROM orders
GROUP BY ROLLUP(YEAR(order_date), QUARTER(order_date));6. Hàm Tổng Hợp Nâng Cao
Ngoài 5 hàm cơ bản, có thêm: COUNT(DISTINCT col) đếm giá trị unique, STRING_AGG() hoặc GROUP_CONCAT() gom text, VARIANCE()/STDDEV() tính phương sai/độ lệch chuẩn. Các hàm này giúp phân tích sâu hơn.
SELECT
department,
COUNT(DISTINCT employee_id) AS unique_employees,
STRING_AGG(employee_name, ', ') AS member_list,
ROUND(STDDEV(salary), 0) AS salary_spread
FROM employees
GROUP BY department;7. Lỗi Thường Gặp
Lỗi phổ biến nhất: cột trong SELECT không có trong GROUP BY cũng không nằm trong aggregate function. MySQL cho phép (trả về random value) nhưng PostgreSQL/SQL Server sẽ báo lỗi. Luôn đảm bảo mỗi cột non-aggregate đều nằm trong GROUP BY.
8. Kết Luận
GROUP BY + aggregate functions = nền tảng của mọi phân tích dữ liệu SQL. Thành thạo 5 hàm cơ bản (COUNT, SUM, AVG, MIN, MAX) + HAVING + ROLLUP là đủ xử lý 90% báo cáo analytics. Hãy luyện tập với dataset thực tế để nắm vững.
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề


