Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tạo cột tháng từ ngày và tính tổng tiền theo tháng (có gom trùng ngày) trong MySQL

Để 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ặc ORDER 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 PurchaseDate hỗ trợ range scan cho GROUP BY.