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

renvoie des zéros pour les dates qui n'existent pas MYSQL GROUP BY

Vous réalisez généralement ce type de choses en JOIN-ing avec une table de valeurs , c'est-à-dire un tableau qui contient toutes les valeurs qui vous intéressent.

Les tables de valeurs typiques peuvent contenir par exemple toutes les valeurs entières comprises entre 0 et 1 000, ou toutes les dates d'une période donnée. Souvent, les tables de valeurs incluent plus de valeurs que souhaité, et nous obtenons la sortie exacte souhaitée en ajoutant des filtres dans la clause WHERE.

Dans ce cas, vous aurez besoin d'un tel tableau contenant des dates. En supposant que cette table s'appelle ValTableDates et qu'elle contient toutes les dates entre janvier 2005 et décembre 2010, la requête ressemblerait à :

SELECT AVG(data) AS data, VT.ValDate
FROM ValTableDates VT
LEFT JOIN  table T ON T.dateReg = VT.ValDate
WHERE VT.ValDate > [Some Start Date] and VT < [Some End Date]
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg) 
ORDER BY dateReg

La requête ci-dessus peut nécessiter quelques ajustements pour obtenir une valeur zéro plutôt que NULL, mais le point principal est que la table de valeurs est généralement le moyen le plus simple de fournir des enregistrements de sortie pour les points de données manquants.
Une alternative consiste à utiliser une fonction/expression qui produit la séquence [date] souhaitée, à l'intérieur d'une sous-requête, mais cela est généralement moins efficace et plus sujet aux erreurs.