Để 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) = 1không dùng index - Thay bằng:
WHERE date >= '2019-01-01' AND date < '2019-02-01'