Bạn đang tìm cách để có được tất cả các ngày được liệt kê, ngay cả những ngày không được hiển thị trong customer
của bạn bàn. Đây là một chứng đau cổ khét tiếng trong SQL. Đó là bởi vì ở dạng thuần túy, SQL thiếu khái niệm về một chuỗi liền kề của bất kỳ thứ gì ... số chính, ngày, bất cứ thứ gì.
Vì vậy, bạn cần giới thiệu một bảng có chứa nguồn các số hoặc ngày tháng hoặc thứ gì đó gần nhau, và sau đó TRÁI THAM GIA dữ liệu hiện có của bạn vào bảng đó.
Có một số cách để làm điều đó. Một là tạo cho mình một calendar
bảng với một hàng cho mỗi ngày trong thập kỷ hoặc thế kỷ hiện tại hoặc bất cứ thứ gì, sau đó tham gia vào hàng đó. (Bảng đó sẽ không lớn lắm so với khả năng của một cơ sở dữ liệu hiện đại.
Giả sử bạn có bảng đó và nó có một cột có tên là date
. Sau đó, bạn sẽ làm điều này.
SELECT calendar.date AS created,
ISNULL(a.customer_count, 0) AS customer_count
FROM calendar
LEFT JOIN (
SELECT COUNT(*) AS customer_count,
DATE(created) AS created
FROM customer
GROUP BY DATE(created)
) a ON calendar.date = a.created
WHERE calendar.date BETWEEN start AND finish
ORDER BY calendar.date
Lưu ý một số điều. Đầu tiên, LEFT JOIN
từ bảng lịch sang tập dữ liệu của bạn. Nếu bạn sử dụng JOIN
thông thường dữ liệu bị thiếu trong tập dữ liệu của bạn sẽ loại bỏ các hàng trong lịch.
Thứ hai, ISNULL
trong toplevel SELECT
để biến các giá trị bị thiếu, rỗng, từ tập dữ liệu của bạn thành các giá trị bằng không.
Bây giờ, bạn hỏi, tôi có thể lấy bảng lịch đó ở đâu? Tôi trân trọng đề nghị bạn tra cứu điều đó và hỏi một câu hỏi khác nếu bạn không thể tìm ra.
Tôi đã viết một bài luận nhỏ về vấn đề này, bạn có thể tìm thấy ở đây. http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/