Trước khi bị lạc trong cú pháp SQL và các biến, nhớ nhé: các hàm tổng hợp là bạn thân nhất khi cần đếm mọi thứ. Chúng giúp bạn tính tổng dữ liệu, giá trị trung bình và làm đủ kiểu phép thuật trên đống dòng dữ liệu khổng lồ.
Các hàm tổng hợp được dùng để thực hiện các phép toán toán học trên nhóm các dòng. Những hàm chính gồm:
SUM(): tính tổng các giá trị.AVG(): tính giá trị trung bình.COUNT(): đếm số dòng trong tập kết quả.
Các hàm tổng hợp cực kỳ hữu ích khi bạn làm việc với dữ liệu lớn và muốn có báo cáo ngắn gọn: có bao nhiêu đơn hàng, tổng số lượng là bao nhiêu, hoặc đơn hàng lớn nhất hôm nay là bao nhiêu. Cùng xem qua vài hàm tổng hợp nhé.
Đếm dòng: hàm COUNT()
Hàm COUNT() giúp đếm số dòng trong bảng. Xem ví dụ cho dễ hiểu nha.
-- Đếm tất cả các dòng trong bảng đơn hàng
SELECT COUNT(*) AS tong_so_don
FROM orders;
-- Đếm số khách hàng duy nhất
SELECT COUNT(DISTINCT customer_id) AS khach_hang_doc_nhat
FROM orders;
-- Đếm số đơn hàng có tổng tiền lớn hơn 100
SELECT COUNT(*) AS don_gia_tri_lon
FROM orders
WHERE total_amount > 100;
Hàm COUNT() thường dùng để đếm bản ghi, giá trị duy nhất, hoặc kết hợp với lọc, ví dụ như "có bao nhiêu sinh viên đăng ký khóa học Python".
Tính tổng dữ liệu: hàm SUM()
Hàm SUM() tính tổng các giá trị trong một cột. Giờ thử tính tổng tất cả các giao dịch mua của khách hàng nhé.
-- Tính tổng doanh thu
SELECT SUM(total_amount) AS tong_doanh_thu
FROM orders;
-- Tổng mua của một khách hàng cụ thể
SELECT SUM(total_amount) AS chi_tieu_khach_hang
FROM orders
WHERE customer_id = 101;
-- Tổng đơn hàng theo danh mục
SELECT category, SUM(total_amount) AS doanh_thu_danh_muc
FROM orders
GROUP BY category;
SUM() là công cụ chính để phân tích doanh số, doanh thu và bất kỳ tổng nào khác. Ví dụ, bạn cần biết thu nhập của tòa nhà văn phòng tháng trước? Dễ thôi.
Giá trị trung bình: hàm AVG()
Hàm AVG() giúp tính giá trị trung bình trên tập dữ liệu. Ví dụ, điểm trung bình của sinh viên hoặc hóa đơn trung bình của khách.
-- Giá trị trung bình của đơn hàng
SELECT AVG(total_amount) AS gia_tri_trung_binh_don
FROM orders;
-- Giá trị trung bình đơn hàng theo danh mục
SELECT category, AVG(total_amount) AS gia_tri_trung_binh_don
FROM orders
GROUP BY category;
-- Hóa đơn trung bình của khách trong 7 ngày gần nhất
SELECT AVG(total_amount) AS trung_binh_hoa_don_7_ngay
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days';
Giá trị trung bình rất hữu ích để phân tích chất lượng dịch vụ, phát hiện bất thường và tính các chỉ số chính như lợi nhuận trung bình trên mỗi khách hàng.
Dùng hàm tổng hợp trong phân tích
Giờ khi đã quen với các hàm cơ bản, cùng xem cách dùng chúng để tạo báo cáo phân tích cơ bản nhé.
Ví dụ 1: tổng doanh thu và số lượng đơn hàng
Giả sử bạn muốn biết có bao nhiêu đơn hàng và tổng doanh thu trong tháng.
SELECT
COUNT(*) AS tong_so_don,
SUM(total_amount) AS tong_doanh_thu
FROM orders
WHERE order_date >= '2023-10-01' AND order_date <= '2023-10-31';
Ví dụ 2: doanh thu trung bình theo danh mục
Nếu muốn chia nhỏ doanh thu theo từng danh mục sản phẩm thì sao?
SELECT
category,
COUNT(*) AS tong_so_don,
SUM(total_amount) AS tong_doanh_thu,
AVG(total_amount) AS trung_binh_don
FROM orders
GROUP BY category;
Ví dụ 3: đơn hàng trong 7 ngày gần nhất
Thường thì cần phân tích chỉ số trong khoảng thời gian ngắn, ví dụ tuần vừa rồi.
SELECT
COUNT(*) AS don_7_ngay,
SUM(total_amount) AS doanh_thu_7_ngay,
AVG(total_amount) AS trung_binh_hoa_don_7_ngay
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days';
Case thực tế với bài toán cụ thể
Bài toán: Phân tích doanh số theo khu vực
Giả sử bạn là chủ chuỗi cửa hàng và muốn xem doanh thu phân bổ theo từng khu vực.
SELECT
region,
COUNT(*) AS tong_so_don,
SUM(total_amount) AS tong_doanh_thu,
AVG(total_amount) AS gia_tri_trung_binh_don
FROM orders
GROUP BY region
ORDER BY tong_doanh_thu DESC;
Bài toán: Top-10 khách hàng theo doanh thu
Giờ thêm chút logic để lấy top-10 khách hàng có tổng đơn hàng lớn nhất.
SELECT
customer_id,
SUM(total_amount) AS tong_chi_tieu
FROM orders
GROUP BY customer_id
ORDER BY tong_chi_tieu DESC
LIMIT 10;
Bài toán: So sánh doanh thu theo ngày trong tuần
Muốn biết ngày nào trong tuần doanh nghiệp kiếm được nhiều nhất? Xem ví dụ này nhé:
SELECT
TO_CHAR(order_date, 'Day') AS ngay_trong_tuan,
SUM(total_amount) AS tong_doanh_thu,
AVG(total_amount) AS trung_binh_don
FROM orders
GROUP BY TO_CHAR(order_date, 'Day')
ORDER BY tong_doanh_thu DESC;
GO TO FULL VERSION