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

Seleziona tutti i mesi all'interno di un determinato intervallo di date, compresi quelli con valori 0

Sono d'accordo con la risposta di Lieven, crea una tabella contenente tutti i mesi di cui potresti aver bisogno e usala per "UNISCITI A SINISTRA" nella tabella dei risultati. Ricorda, questa è una tabella davvero piccola, solo 365 (ish) righe all'anno di dati che hai... E puoi facilmente scrivere del codice per popolare inizialmente questa tabella

Lo facciamo qui e offre molti vantaggi, ad esempio, immagina una tabella di dati mensili con i seguenti campi (e tutti gli altri che ti vengono in mente!) Completamente popolati per tutti i mesi in un determinato intervallo;

  • Data (ad es. 01-04-2009)
  • Giorno (es. 1)
  • Giorno della settimana (es. mercoledì)
  • Mese (es. 4)
  • Anno (es. 2009)
  • Anno finanziario (es. 2009/10)
  • Trimestre finanziario (es. 1° trimestre 2009)
  • Trimestre di calendario (ad es. 2° trimestre 2009)

Quindi combinalo con la tua query sopra, come segue;

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`

Potrebbero esserci degli errori nel mio codice SQL poiché non sono stato in grado di creare le tabelle di test, ma spero che tu possa ottenere il principal e modificare in base alle tue esigenze!

Usando questo, puoi cambiare la tua clausola "GRUPPO PER" in qualsiasi cosa tu abbia nella tabella "dateTable", che può permetterti di riportare facilmente per trimestre finanziario, mese, giorno, giorno della settimana, ecc.

Spero di esserti stato d'aiuto!