2010-06-04 18 views
2

J'ai donc une table où je recueille des données pour les tâches que je fais. Chaque fois que je crée un travail, je lui assigne une date. Le problème avec ceci est que les jours où je n'ai pas d'emploi ne sont pas stockés dans la base de données donc quand je représente graphiquement mes données, je ne vois jamais les jours où je n'avais aucun travail.Récupérer les dates manquantes de la base de données via MySQL

Ma requête en cours ressemble à ceci:

SELECT job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM job_data 
WHERE job_data_date >= '2010-05-05' 
GROUP BY job_data_date 
ORDER BY job_data_date; 

La sortie est:

| job_data_date | job_data_date_income | 
| 2010-05-17  | 125      | 
| 2010-05-18  | 190      | 
| 2010-05-20  | 170      | 

Comme vous pouvez le voir dans la sortie exemple 2010-05-19 ne figurerait pas dans les résultats car il n'a jamais été stocké là.

Existe-t-il un moyen d'afficher les dates manquantes?

Merci,

Marat

+0

* Copies possibles, au moins en rapport: * http://stackoverflow.com/questions/2501993/mysql-filling-in-missing-dates, http://stackoverflow.com/questions/2844486/mysql-to- fill-in-missing-dates-when-using-groupe-par-datetable-timestamp-without, http://stackoverflow.com/questions/400759/sql-group-by-date-but-get-dates-wo- records-too –

Répondre

1

Il n'y a aucun moyen raisonnable de le faire en utilisant SQL pur, sur MySQL au moins, sans créer une table chaque jour jamais conçue. Votre meilleure option est de modifier l'application qui utilise les résultats de cette requête pour remplir les trous elle-même. Plutôt que de représenter graphiquement uniquement les valeurs reçues, construisez son propre ensemble de valeurs avec une simple boucle; compter un jour à la fois, en remplissant les valeurs de la requête où elles sont disponibles.

+1

Les requêtes récursives sont destinées à des choses comme ça, mais MySQL ne supporte pas la syntaxe WITH :( –

2

Une idée est que vous pourriez avoir une table avec toutes les dates que vous voulez montrer, puis faire une jointure externe avec cette table.

Donc, si vous aviez une table appelée alldates avec une colonne (job_data_date):

SELECT ad.job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM alldates ad left outer join job_data jd on ad.job_data_date = jd.job_data_date 
WHERE ad.job_data_date >= '2010-05-05' 
GROUP BY ad.job_data_date 
ORDER BY ad.job_data_date; 

L'inconvénient est que vous devez garder cette table remplie avec toutes les dates que vous souhaitez afficher.

+0

Une table NUMBERS est plus courante - il suffit d'utiliser DATE_ADD pour obtenir votre date en fonction d'un point de départ. l'OP doit générer une liste de dates et de LEFT JOIN par rapport à cela. –