Bài viết này sẽ trình bày cách sử dụng SQL để truy vấn số lượng bản ghi mỗi ngày trong một khoảng thời gian nhất định hoặc số ngày trước đó. Các giá trị không tồn tại sẽ được điền bằng 0.
hoat_dong_kinh_doanh: Tên bảng kinh doanh.
thoi_gian_tao: Trường thời gian trong bảng kinh doanh, dùng để thống kê số lượng.
ngay: Biến đại diện cho ngày thống kê (có thể thay đổi tên).
so_luong: Biến đại diện cho kết quả số lượng (có thể thay đổi tên).
bảng_thoigian: Bảng chứa tất cả các ngày phù hợp điều kiện.
bảng_kinhdoanh: Bảng kinh doanh đã nhóm theo ngày và đếm số lượng bản ghi mỗi ngày.
Cuối cùng, chúng ta sử dụng phép nối trái (LEFT JOIN) để ghép hai bảng và trả về kết quả cuối cùng.
- Truy vấn số ngày trước
SELECT b.ngay, IFNULL(a.so_luong, 0) AS so_luong FROM (
SELECT DATE_SUB(CURDATE(), INTERVAL s.so_ngay DAY) AS ngay
FROM (
SELECT 0 AS so_ngay UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) s
WHERE DATE_SUB(CURDATE(), INTERVAL s.so_ngay DAY) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
) b
LEFT JOIN (
SELECT COUNT(*) AS so_luong, DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d') AS ngay
FROM hoat_dong_kinh_doanh
GROUP BY DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d')
) a ON b.ngay = a.ngay
ORDER BY b.ngay;
Kết quả: Truy vấn số lượng bản ghi mỗi ngày từ hôm nay đến 7 ngày trước.
- Truy vấn trong một khoảng thời gian
SELECT b.ngay, IFNULL(a.so_luong, 0) AS so_luong FROM (
SELECT DATE_FORMAT('2024-03-31', '%Y-%m-%d') - INTERVAL s.so_ngay DAY AS ngay
FROM (
SELECT 0 AS so_ngay UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14
UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19
UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24
UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL SELECT 29
UNION ALL SELECT 30
) s
GROUP BY ngay HAVING ngay BETWEEN '2024-03-01' AND '2024-03-31'
) b
LEFT JOIN (
SELECT COUNT(*) AS so_luong, DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d') AS ngay
FROM hoat_dong_kinh_doanh
GROUP BY DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d')
) a ON b.ngay = a.ngay
ORDER BY b.ngay;
Kết quả: Truy vấn số lượng bản ghi mỗi ngày từ ngày 2024-03-01 đến 2024-03-31.