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

Lọc và nhóm bản ghi theo tháng trong MySQL

Để thống kê dữ liệu theo tháng, sử dụng MONTH() hoặc MONTHNAME() kết hợp GROUP BY và hàm tập hợp SUM().

Ví dụ minh họa

Tạo bảng mua hàng:

mysql> CREATE TABLE SelectPerMonthDemo (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Price INT,
    -> PurchaseDate DATETIME
    -> );

Chèn dữ liệu các tháng khác nhau:

mysql> INSERT INTO SelectPerMonthDemo(Price, PurchaseDate) VALUES(600, DATE_ADD(NOW(), INTERVAL -1 MONTH));
mysql> INSERT INTO SelectPerMonthDemo(Price, PurchaseDate) VALUES(600, DATE_ADD(NOW(), INTERVAL 2 MONTH));
mysql> INSERT INTO SelectPerMonthDemo(Price, PurchaseDate) VALUES(400, NOW());
mysql> INSERT INTO SelectPerMonthDemo(Price, PurchaseDate) VALUES(800, DATE_ADD(NOW(), INTERVAL 3 MONTH));
mysql> INSERT INTO SelectPerMonthDemo(Price, PurchaseDate) VALUES(900, DATE_ADD(NOW(), INTERVAL 4 MONTH));
mysql> INSERT INTO SelectPerMonthDemo(Price, PurchaseDate) VALUES(100, DATE_ADD(NOW(), INTERVAL 4 MONTH));
mysql> INSERT INTO SelectPerMonthDemo(Price, PurchaseDate) VALUES(1200, DATE_ADD(NOW(), INTERVAL -1 MONTH));

Dữ liệu (giả sử NOW() = 2019-02-10):

+----+-------+---------------------+
| Id | Price | PurchaseDate        |
+----+-------+---------------------+
|  1 |   600 | 2019-01-10 22:39:30 |
|  2 |   600 | 2019-04-10 22:39:47 |
|  3 |   400 | 2019-02-10 22:40:03 |
|  4 |   800 | 2019-05-10 22:40:18 |
|  5 |   900 | 2019-06-10 22:40:29 |
|  6 |   100 | 2019-06-10 22:40:41 |
|  7 |  1200 | 2019-01-10 22:40:50 |
+----+-------+---------------------+

Thống kê theo tên tháng

mysql> SELECT MONTHNAME(PurchaseDate) AS MONTHNAME, SUM(Price) 
    -> FROM SelectPerMonthDemo 
    -> GROUP BY MONTHNAME(PurchaseDate);

Kết quả:

+-----------+------------+
| MONTHNAME | SUM(Price) |
+-----------+------------+
| January   |       1800 |
| February  |        400 |
| April     |        600 |
| May       |        800 |
| June      |       1000 |
+-----------+------------+

Thống kê theo số tháng (1-12)

mysql> SELECT MONTH(PurchaseDate), SUM(Price) 
    -> FROM SelectPerMonthDemo 
    -> GROUP BY MONTH(PurchaseDate);

Kết quả:

+---------------------+------------+
| MONTH(PurchaseDate) | SUM(Price) |
+---------------------+------------+
|                   1 |       1800 |
|                   2 |        400 |
|                   4 |        600 |
|                   5 |        800 |
|                   6 |       1000 |
+---------------------+------------+

Mở rộng: Thống kê theo năm + tháng

SELECT YEAR(PurchaseDate) AS Nam, MONTH(PurchaseDate) AS Thang, SUM(Price) AS TongTien
FROM SelectPerMonthDemo
GROUP BY YEAR(PurchaseDate), MONTH(PurchaseDate)
ORDER BY Nam, Thang;

Lưu ý hiệu suất

  • Tạo index trên cột ngày: INDEX idx_purchase_date (PurchaseDate)
  • Tránh hàm trên cột trong WHERE: WHERE MONTH(date) = 1 không dùng index
  • Thay bằng: WHERE date >= '2019-01-01' AND date < '2019-02-01'