U bent op zoek naar een manier om alle dagen in de lijst te krijgen, zelfs de dagen die niet zijn vertegenwoordigd in uw customer
tafel. Dit is een beruchte nekpijn in SQL. Dat komt omdat SQL in zijn pure vorm het concept mist van een aaneengesloten reeks van iets ... hoofdtelwoorden, dagen, wat dan ook.
Je moet dus een tabel introduceren die een bron bevat van aaneengesloten hoofdtelwoorden, of datums, of zoiets, en dan LEFT JOIN je bestaande gegevens aan die tabel.
Er zijn een paar manieren om dat te doen. Een daarvan is om voor jezelf een calendar
te maken tabel met een rij voor elke dag in het huidige decennium of de huidige eeuw of wat dan ook, sluit u er dan bij aan. (Die tabel zal niet erg groot zijn in vergelijking met de mogelijkheden van een moderne database.
Laten we zeggen dat je die tabel hebt, en het heeft een kolom met de naam date
. Dan zou je dit doen.
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
Let op een paar dingen. Eerst de LEFT JOIN
van de kalendertabel naar uw dataset. Als je een gewone JOIN
. gebruikt de ontbrekende gegevens in uw dataset zullen de rijen uit de kalender onderdrukken.
Ten tweede, de ISNULL
op het hoogste niveau SELECT
om de ontbrekende, null-waarden van uw dataset om te zetten in nulwaarden.
Nu vraag je je af, waar kan ik die kalendertafel krijgen? Ik raad je aan om dat op te zoeken en een andere vraag te stellen als je er niet uit komt.
Ik heb hier een klein essay over geschreven, dat je hier kunt vinden.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/