Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wählen Sie alle Monate innerhalb der angegebenen Zeitspanne aus, einschließlich derjenigen mit 0-Werten

Ich stimme der Antwort von Lieven zu, erstellen Sie eine Tabelle mit allen Monaten, die Sie jemals benötigen könnten, und verwenden Sie diese, um "LEFT JOIN" zu Ihrer Ergebnistabelle zu machen. Denken Sie daran, dass dies eine wirklich winzige Tabelle ist, nur 365 (etwa) Zeilen Daten pro Jahr, die Sie haben ... Und Sie können leicht Code schreiben, um diese Tabelle anfänglich zu füllen

Wir tun dies hier, und es bietet viele Vorteile, stellen Sie sich beispielsweise eine monatliche Datentabelle mit den folgenden Feldern (und allen anderen, die Ihnen einfallen!) vor, die für alle Monate in einem bestimmten Bereich vollständig ausgefüllt sind;

  • Datum (z. B. 01.04.2009)
  • Tag (z. B. 1)
  • Wochentag (z. B. Mittwoch)
  • Monat (z. B. 4)
  • Jahr (z. B. 2009)
  • Geschäftsjahr (z. B. 2009/10)
  • Geschäftsquartal (z. B. 2009Q1)
  • Kalenderquartal (z. B. 2009Q2)

Kombinieren Sie dies dann wie folgt mit Ihrer obigen Abfrage:

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`

Es kann einige Fehler in meinem SQL-Code geben, da ich die Testtabellen nicht erstellen konnte, aber hoffentlich erhalten Sie den Prinzipal und die Änderung, die Ihren Anforderungen entsprechen!

Auf diese Weise können Sie Ihre "GROUP BY"-Klausel ändern, was auch immer Sie in der "dateTable"-Tabelle haben, was Ihnen eine einfache Berichterstellung nach Finanzquartal, Monat, Tag, Wochentag usw. ermöglicht.

Hoffe das hilft!