Szukasz sposobu, aby wyświetlić wszystkie dni na liście, nawet te, które nie są reprezentowane przez Twojego customer
stół. To jest notoryczny ból szyi w SQL. To dlatego, że w czystej postaci SQL nie ma koncepcji ciągłego ciągu czegokolwiek... liczb kardynalnych, dni, czegokolwiek.
Musisz więc wprowadzić tabelę zawierającą źródło ciągłych liczb kardynalnych, dat lub czegoś podobnego, a następnie DOŁĄCZYĆ istniejące dane w lewo do tej tabeli.
Jest na to kilka sposobów. Jednym z nich jest stworzenie sobie calendar
stół z rzędem na każdy dzień w obecnej dekadzie, stuleciu lub cokolwiek innego, a następnie dołącz do niego. (Ta tabela nie będzie zbyt duża w porównaniu z możliwościami nowoczesnej bazy danych.
Załóżmy, że masz tę tabelę i zawiera kolumnę o nazwie date
. Wtedy byś to zrobił.
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
Zwróć uwagę na kilka rzeczy. Najpierw LEFT JOIN
z tabeli kalendarza do zestawu danych. Jeśli używasz zwykłego JOIN
brakujące dane w zestawie danych będą pomijać wiersze z kalendarza.
Po drugie, ISNULL
w najwyższym poziomie SELECT
aby zamienić brakujące, puste wartości z zestawu danych na wartości zerowe.
Teraz pytasz, gdzie mogę dostać tę tabelę kalendarza? Z szacunkiem sugeruję, abyś to sprawdził i zadał kolejne pytanie, jeśli nie możesz tego rozgryźć.
Napisałem na ten temat mały esej, który można znaleźć tutaj.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/