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

Intento escribir una consulta MySQL para obtener un valor promedio por mes, para todos los meses entre fechas dadas. Mi idea es esta:

Consulta, algo así como

SELECT AVG(value1) as avg_value_1, AVG(value2) as avg_value_2, MONTH(save_date) as month, YEAR(save_date) as year FROM myTable WHERE save_date BETWEEN '2009-01-01' AND '2009-07-01' GROUP BY YEAR(save_date), MONTH(save_date) avg_value_1 | avg_value_2 | month | year 5 | 4 | 1 | 2009 2 | 1 | 2 | 2009 7 | 5 | 3 | 2009 0 | 0 | 4 | 2009 <--- 6 | 5 | 5 | 2009 3 | 6 | 6 | 2009 

Verá, no se ingresaron valores durante abril de 2009, sin embargo, quiero que aparezca como un valor de 0, 0 en la salida. ¿Alguna idea sobre cómo lograr esto? ¿Se puede hacer dentro de MySQL?

Estoy de acuerdo con la respuesta de Lieven de crear una tabla que contenga todos los meses que puedas necesitar, y la utilizo para “IZQUIERDA” a tu tabla de resultados. Recuerde, esta es una tabla muy pequeña, solo 365 (ish) filas por año de datos que tiene … Y puede escribir fácilmente algún código para completar esta tabla inicialmente

Hacemos esto aquí, y ofrece muchos beneficios, por ejemplo, imagine una tabla de datos mensuales con los siguientes campos (¡y cualquier otro que pueda pensar!) Totalmente poblado para todos los meses en un rango dado;

  • Fecha (Ej. 2009-04-01)
  • Día (Ej. 1)
  • Día de la semana (p. Ej. Miércoles)
  • Mes (Ejemplo 4)
  • Año (Ej. 2009)
  • Ejercicio (por ejemplo, 2009/10)
  • Cuarto financiero (Ej. 2009Q1)
  • Cuarto del calendario (p. Ej., 2009Q2)

Luego, combina esto con tu consulta anterior, de la siguiente manera;

 SELECCIONAR `DT` .myYear`,` DT``myMonth`, 
            AVG (`myTable``value1`) como avg_value_1, 
            AVG (`myTable``value2`) como avg_value_2

 FROM `dateTable` como DT
 IZQUIERDA ÚNETE a 'myTable`
     ON `dateTable` .myDate` =` myTable``save_date`

 DONDE `datetable``myDate` ENTRE '2009-01-01' Y '2009-07-01'

 GRUPO POR `DT` .myYear`,` DT``myMonth`

Puede haber algunos errores en mi código SQL, ya que no he podido crear las tablas de prueba, pero con suerte obtendrá el principal y lo modificará según sus necesidades.

Al usar esto, puede cambiar su cláusula “AGRUPAR POR” a lo que tenga en la tabla “tabla de fechas”, lo que le permite informar fácilmente por trimestre financiero, mes, día, día de la semana, etc.

¡Espero que ayude!

La manera más fácil probablemente sea crear una tabla de fechas que contenga meses y años y unir esto con su resultado final.

Intereting Posts