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

Sélectionnez tous les mois dans une période donnée, y compris ceux avec des valeurs 0

Je suis d'accord avec la réponse de Lieven, créez un tableau contenant tous les mois dont vous pourriez avoir besoin et utilisez-le pour "LEFT JOIN" à votre tableau de résultats. N'oubliez pas qu'il s'agit d'une table vraiment minuscule, avec seulement 365 (presque) lignes de données par an... Et vous pouvez facilement écrire du code pour remplir cette table initialement

Nous le faisons ici, et cela offre de nombreux avantages, par exemple, imaginez un tableau de données mensuel avec les champs suivants (et tous les autres auxquels vous pouvez penser !) entièrement remplis pour tous les mois d'une plage donnée ;

  • Date (par exemple, 2009-04-01)
  • Jour (par exemple 1)
  • Jour de la semaine (par exemple, mercredi)
  • Mois (par exemple 4)
  • Année (par exemple, 2009)
  • Exercice financier (par exemple, 2009/10)
  • Trimestre financier (par exemple, 1er trimestre 2009)
  • Trimestre civil (par exemple, 2009Q2)

Ensuite, combinez ceci avec votre requête ci-dessus, comme suit :

SELECT `DT`.`myYear`, `DT`.`myMonth`, 
           AVG(`myTable`.`value1`) as avg_value_1, 
           AVG(`myTable`.`value2`) as avg_value_2

FROM `dateTable` as DT
LEFT JOIN `myTable`
    ON `dateTable`.`myDate` = `myTable`.`save_date`

WHERE `dateTable`.`myDate` BETWEEN '2009-01-01' AND '2009-07-01'

GROUP BY `DT`.`myYear`, `DT`.`myMonth`

Il peut y avoir des erreurs dans mon code SQL car je n'ai pas été en mesure de créer les tables de test, mais j'espère que vous obtiendrez le principal et que vous le modifierez en fonction de vos besoins !

Grâce à cela, vous pouvez remplacer votre clause "GROUP BY" par ce que vous avez dans la table "dateTable", ce qui peut vous permettre de générer facilement des rapports par trimestre financier, mois, jour, jour de la semaine, etc.

J'espère que ça aide !