Търсите начин да получите всички изброени дни, дори онези дни, които не са представени във вашия customer
маса. Това е известна болка във врата в SQL. Това е така, защото в чистата си форма на SQL липсва концепцията за непрекъсната последователност от каквото и да било... кардинални числа, дни, каквото и да е.
Така че, трябва да представите таблица, съдържаща източник на последователни кардинални числа, дати или нещо подобно, и след това НАЛЯВО ПРИСЪЕДИНЕТЕ съществуващите си данни към тази таблица.
Има няколко начина да направите това. Единият е да си създадете calendar
таблица с ред за всеки ден от настоящото десетилетие или век или каквото и да е, след което се присъединете към нея. (Тази таблица няма да е много голяма в сравнение с възможностите на модерна база данни.
Да приемем, че имате тази таблица и тя има колона с име date
. Тогава бихте направили това.
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
Забележете няколко неща. Първо, LEFT JOIN
от таблицата на календара към вашия набор от данни. Ако използвате обикновен JOIN
липсващите данни във вашия набор от данни ще потиснат редовете от календара.
Второ, ISNULL
в SELECT
от най-високо ниво за да превърнете липсващите нулеви стойности от вашия набор от данни в нулеви стойности.
Сега, питате, къде мога да намеря тази календарна таблица? С уважение ви предлагам да разгледате това и да зададете друг въпрос, ако не можете да го разберете.
Написах малко есе за това, което можете да намерите тук.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/