Hledáte způsob, jak získat všechny dny v seznamu, dokonce i ty dny, které nejsou zastoupeny u vašeho customer
stůl. To je notoricky známá bolest v krku v SQL. Je to proto, že ve své čisté formě SQL postrádá koncept souvislé posloupnosti čehokoli ... kardinálních čísel, dnů, čehokoli.
Takže musíte zavést tabulku obsahující zdroj souvislých hlavních čísel nebo dat nebo tak něco, a pak LEVÝM PŘIPOJIT svá existující data k této tabulce.
Existuje několik způsobů, jak toho dosáhnout. Jedním z nich je vytvořit si calendar
tabulku s řádkem pro každý den v tomto desetiletí nebo století nebo cokoliv jiného, pak se k ní připojte. (Tato tabulka nebude příliš velká ve srovnání se schopnostmi moderní databáze.
Řekněme, že máte tuto tabulku a má sloupec s názvem date
. Pak byste to udělali.
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
Všimněte si několika věcí. Nejprve LEFT JOIN
z tabulky kalendáře do vaší datové sady. Pokud použijete obyčejný JOIN
chybějící data ve vaší datové sadě potlačí řádky z kalendáře.
Za druhé, ISNULL
v nejvyšší úrovni SELECT
pro přeměnu chybějících, nulových hodnot z vaší datové sady na nulové hodnoty.
Nyní se ptáte, kde mohu získat tu tabulku kalendáře? Uctivě vám navrhuji, abyste si to prohledali a pokud na to nemůžete přijít, položte další otázku.
Napsal jsem o tom malou esej, kterou najdete zde.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/