sql >> Database teknologi >  >> RDS >> Mysql

Vælg alle måneder inden for et givet datospænd, inklusive dem med 0 værdier

Jeg er enig i Lievens svar, lav en tabel, der indeholder alle de måneder, du nogensinde kunne kræve, og brug den til at "LEFT JOIN" til din resultattabel. Husk, at dette er en meget lille tabel, kun 365(ish) rækker per år med data, du har... Og du kan nemt skrive noget kode for at udfylde denne tabel i starten

Det gør vi her, og det giver en masse fordele, for eksempel, forestil dig en månedlig datatabel med følgende felter (og alle andre du kan komme i tanke om!) fuldt udfyldt for alle måneder i et givet interval;

  • Dato (f.eks. 2009-04-01)
  • Dag (f.eks. 1)
  • Ugedag (f.eks. onsdag)
  • Måned (f.eks. 4)
  • År (f.eks. 2009)
  • Regnskabsår (f.eks. 2009/10)
  • Finansielt kvartal (f.eks. 1. kvartal 2009)
  • Kalenderkvartal (f.eks. 2. kvartal 2009)

Kombiner derefter dette med din forespørgsel ovenfor, som følger;

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`

Der kan være nogle fejl i min SQL-kode, da jeg ikke har været i stand til at oprette testtabellerne, men forhåbentlig får du principalen og ændringen, så den passer til dine behov!

Ved at bruge dette kan du ændre din "GROUP BY"-klausul til det, du har i "dateTable"-tabellen, hvilket giver dig mulighed for nemt at rapportere efter finanskvartal, måned, dag, ugedag osv.

Håber det hjælper!



  1. lastInsertId virker ikke i Postgresql

  2. Sådan importeres XML-fil i Oracle SQL Developer?

  3. LOCALTIME eksempler – MySQL

  4. identitet fra sql indsæt via jdbctemplate