Du leder efter en måde at få alle dage på listen, selv de dage, der ikke er repræsenteret i din customer
bord. Dette er en berygtet smerte i nakken i SQL. Det er fordi SQL i sin rene form mangler konceptet om en sammenhængende sekvens af noget som helst ... kardinaltal, dage, hvad som helst.
Så du er nødt til at introducere en tabel, der indeholder en kilde til sammenhængende kardinaltal, eller datoer eller noget, og derefter VENSTRE JOIN dine eksisterende data til den tabel.
Der er et par måder at gøre det på. Den ene er at oprette dig selv en calendar
bord med en række for hver dag i det nuværende årti eller århundrede eller hvad som helst, så tilslut dig det. (Den tabel vil ikke være særlig stor sammenlignet med en moderne databases muligheder.
Lad os sige, at du har den tabel, og den har en kolonne med navnet date
. Så ville du gøre dette.
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æg mærke til et par ting. Først LEFT JOIN
fra kalendertabellen til dit datasæt. Hvis du bruger en almindelig JOIN
de manglende data i dit datasæt vil undertrykke rækkerne fra kalenderen.
For det andet, ISNULL
i topniveauet SELECT
for at omdanne de manglende, null-værdier fra dit datasæt til nulværdier.
Nu spørger du, hvor kan jeg få det kalenderbord? Jeg foreslår med respekt, at du slår det op og stiller et andet spørgsmål, hvis du ikke kan finde ud af det.
Jeg skrev et lille essay om dette, som du kan finde her.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/