Stai cercando un modo per ottenere tutti i giorni elencati, anche quei giorni che non sono rappresentati nel tuo customer
tavolo. Questo è un famigerato dolore al collo in SQL. Questo perché nella sua forma pura SQL manca del concetto di una sequenza contigua di qualsiasi cosa... numeri cardinali, giorni, qualunque cosa.
Quindi, devi introdurre una tabella contenente una fonte di numeri cardinali contigui, o date, o qualcosa del genere, e quindi LEFT JOIN i tuoi dati esistenti a quella tabella.
Ci sono alcuni modi per farlo. Uno è creare un calendar
tavolo con una riga per ogni giorno del decennio o del secolo attuale o altro, quindi unisciti ad esso. (Quella tabella non sarà molto grande rispetto alla capacità di un database moderno.
Supponiamo che tu abbia quella tabella e che abbia una colonna denominata date
. Allora lo faresti.
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
Nota un paio di cose. Innanzitutto, il LEFT JOIN
dalla tabella del calendario al tuo set di dati. Se utilizzi un normale JOIN
i dati mancanti nel tuo set di dati elimineranno le righe dal calendario.
Secondo, il ISNULL
nel livello superiore SELECT
per trasformare i valori nulli mancanti dal tuo set di dati in valori zero.
Ora, chiedi, dove posso trovare quella tabella del calendario? Ti suggerisco rispettosamente di cercarlo e di fare un'altra domanda se non riesci a capirlo.
Ho scritto un piccolo saggio su questo, che puoi trovare qui.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-interegers/