sql >> Base de Datos >  >> RDS >> Mysql

Seleccione todos los meses dentro del intervalo de fechas dado, incluidos los que tienen valores 0

Estoy de acuerdo con la respuesta de Lieven, cree una tabla que contenga todos los meses que pueda necesitar y utilícela para "LEFT JOIN" en su tabla de resultados. Recuerde, esta es una tabla realmente pequeña, solo 365 (más o menos) filas por año de datos que tiene... Y puede escribir código fácilmente para completar esta tabla inicialmente

Hacemos esto aquí, y brinda muchos beneficios, por ejemplo, imagine una tabla de datos mensuales con los siguientes campos (¡y cualquier otro que se le ocurra!) Completamente poblado para todos los meses en un rango determinado;

  • Fecha (por ejemplo, 2009-04-01)
  • Día (por ejemplo, 1)
  • Día de la semana (por ejemplo, miércoles)
  • Mes (por ejemplo, 4)
  • Año (por ejemplo, 2009)
  • Año fiscal (por ejemplo, 2009/10)
  • Trimestre financiero (por ejemplo, 2009Q1)
  • Trimestre del calendario (por ejemplo, 2009Q2)

Luego, combine esto con su consulta anterior, de la siguiente manera;

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`

Puede haber algunos errores en mi código SQL ya que no he podido crear las tablas de prueba, ¡pero espero que obtenga el principal y modifique para satisfacer sus necesidades!

Con esto, puede cambiar su cláusula "GROUP BY" a lo que tenga en la tabla "dateTable", lo que le permite informar fácilmente por trimestre financiero, mes, día, día de la semana, etc.

¡Espero que eso ayude!