Để thống kê tổng tiền theo **tháng-năm** từ cột DATE, dùng DATE_FORMAT(cot, '%Y-%m') trong GROUP BY và SELECT. Hàm DATE_FORMAT trích xuất chuỗi 'YYYY-MM' để gom nhóm chính xác (khác nhau giữa 2018-10 và 2019-10).
Ví dụ minh họa
Tạo bảng mua hàng:
mysql> CREATE TABLE DemoTable (PurchaseDate DATE, Amount INT);
mysql> INSERT INTO DemoTable VALUES
-> ('2019-10-12',500), ('2018-10-12',1000), ('2019-01-10',600),
-> ('2018-10-12',600), ('2018-11-10',800);
Dữ liệu: 2018-10-12 xuất hiện 2 lần (1000+600=1600).
Truy vấn: Gom theo tháng-năm, tính tổng Amount, hiển thị tên tháng viết tắt:
mysql> SELECT SUM(Amount) AS Amount,
-> DATE_FORMAT(PurchaseDate, '%b') AS Month
-> FROM DemoTable
-> GROUP BY DATE_FORMAT(PurchaseDate, '%Y-%m');
Kết quả:
+--------+-------+ | Amount | Month | +--------+-------+ | 500 | Oct | -- 2019-10 | 1600 | Oct | -- 2018-10 (1000+600) | 600 | Jan | -- 2019-01 | 800 | Nov | -- 2018-11 +--------+-------+
Giải thích
GROUP BY DATE_FORMAT(PurchaseDate, '%Y-%m'): gom chính xác theo tháng-năm (2018-10 ≠ 2019-10).DATE_FORMAT(PurchaseDate, '%b')trong SELECT: hiển thị tên tháng viết tắt (Oct, Jan, Nov).SUM(Amount): tổng tiền mỗi nhóm.
⚠️ Cạm bẫy thường gặp
Nếu chỉ GROUP BY DATE_FORMAT(PurchaseDate, '%b') (chỉ tháng, không năm):
- 2018-10 và 2019-10 sẽ bị gộp nhầm thành một nhóm 'Oct' → tổng sai.
- Luôn gom theo '%Y-%m' hoặc
YEAR(cot), MONTH(cot).
Mở rộng
- Sắp xếp theo thời gian:
ORDER BY MIN(PurchaseDate)hoặcORDER BY DATE_FORMAT(PurchaseDate, '%Y-%m'). - Điền tháng thiếu (0 doanh thu): cần bảng lịch (calendar table) LEFT JOIN.
- Index trên
PurchaseDatehỗ trợ range scan cho GROUP BY.