Mysql
 sql >> Base de données >  >> RDS >> Mysql

Obtenir des décomptes quotidiens pour les événements qui ne se produisent pas tous les jours

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/