Du letar efter ett sätt att få alla dagar listade, även de dagar som inte är representerade i din customer
tabell. Detta är en ökänd smärta i nacken i SQL. Det beror på att SQL i sin rena form saknar konceptet med en sammanhängande sekvens av vad som helst ... kardinaltal, dagar, vad som helst.
Så du måste introducera en tabell som innehåller en källa med sammanhängande kardinalnummer, eller datum eller något, och sedan VÄNSTER FÖRENA dina befintliga data till den tabellen.
Det finns några sätt att göra det på. En är att skapa dig en calendar
bord med en rad för varje dag under innevarande årtionde eller århundrade eller vad som helst, gå sedan med i det. (Den tabellen kommer inte att vara särskilt stor jämfört med kapaciteten hos en modern databas.
Låt oss säga att du har den tabellen och den har en kolumn som heter date
. Då skulle du göra det här.
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ägg märke till ett par saker. Först, LEFT JOIN
från kalendertabellen till din datauppsättning. Om du använder en vanlig JOIN
de data som saknas i din datamängd kommer att dölja raderna från kalendern.
För det andra, ISNULL
i toppnivån SELECT
för att omvandla de saknade nollvärdena från din datauppsättning till nollvärden.
Nu frågar du, var kan jag få tag i det där kalenderbordet? Jag föreslår respektfullt att du slår upp det och ställer en annan fråga om du inte kan lista ut det.
Jag skrev en liten uppsats om detta, som du hittar här.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/