Vous cherchez un moyen d'obtenir tous les jours répertoriés, même les jours qui ne sont pas représentés dans votre customer
table. C'est une douleur notoire dans le cou en SQL. C'est parce que dans sa forme pure, SQL n'a pas le concept d'une séquence contiguë de quoi que ce soit ... des nombres cardinaux, des jours, peu importe.
Donc, vous devez introduire une table contenant une source de nombres cardinaux contigus, ou des dates, ou quelque chose, puis LEFT JOIN vos données existantes à cette table.
Il y a plusieurs façons de le faire. L'une consiste à créer vous-même un calendar
tableau avec une ligne pour chaque jour de la décennie ou du siècle actuel ou autre, puis joignez-le. (Cette table ne sera pas très volumineuse par rapport à la capacité d'une base de données moderne.
Disons que vous avez cette table, et qu'elle a une colonne nommée date
. Alors tu ferais ça.
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
Remarquez quelques choses. Tout d'abord, le LEFT JOIN
de la table de calendrier à votre ensemble de données. Si vous utilisez un JOIN
ordinaire les données manquantes dans votre ensemble de données supprimeront les lignes du calendrier.
Deuxièmement, le ISNULL
dans le niveau supérieur SELECT
pour transformer les valeurs nulles manquantes de votre ensemble de données en valeurs nulles.
Maintenant, demandez-vous, où puis-je obtenir ce tableau de calendrier ? Je vous suggère respectueusement de regarder cela et de poser une autre question si vous ne pouvez pas le comprendre.
J'ai écrit un petit essai à ce sujet, que vous pouvez trouver ici.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/