2010-06-22 8 views
5

Ich versuche eine MySQL-Abfrage zu schreiben, um einen Durchschnittswert pro Monat für alle Monate zwischen bestimmten Daten zu erhalten. Meine Idee ist folgende:Wählen Sie alle Monate innerhalb eines bestimmten Zeitraums, einschließlich der mit 0 Werte

Abfrage, so etwas wie

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 

Sie sehen, wurden keine Werte im April 2009 eingetragen, doch ich will es zeigen sich als 0, 0 Wert in der Ausgabe. Irgendwelche Ideen, wie man das erreicht? Kann das in MySQL gemacht werden?

Antwort

6

Ich stimme Lieven's Antwort zu Erstellen Sie eine Tabelle mit allen Monaten, die Sie jemals benötigen könnten, und verwenden Sie das, um "LEFT JOIN" zu Ihrer Ergebnistabelle. Denken Sie daran, dies ist eine wirklich kleine Tabelle, nur 365 (ish) Zeilen pro Jahr von Daten, die Sie haben ... Und Sie können leicht schreiben einige Code zum Auffüllen dieser Tabelle zunächst

Wir tun dies hier, und es gibt viele Nutzen Sie zum Beispiel eine monatliche Datentabelle mit den folgenden Feldern (und allen anderen, die Sie sich vorstellen können!), die für alle Monate in einem bestimmten Bereich vollständig ausgefüllt sind;

  • Datum (zB 2009-04-01)
  • Tag (zB 1)
  • Wochentag (zB Mittwoch)
  • Monat (zB 4)
  • Jahr (zB 2009)
  • Geschäftsjahr (zB 2009/10)
  • Financial Quarter (zB 2009Q1)
  • Kalenderquartal (zB 2009Q2)

Dann kombinieren Sie dies mit Ihrer Abfrage oben, wie folgt;

 
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 sein, wie ich nicht in der Lage gewesen, die Testtabellen zu erstellen, aber hoffentlich werden Sie die Haupt erhalten und ändern Sie Ihre Bedürfnisse anzupassen!

diese verwenden, können Sie Ihre „GROUP BY“ Klausel ändern, was auch immer Sie in der „dateTable“ Tabelle hat, die Sie bequem mit dem Finanzviertel berichten lassen kann, Monat, Tag, Wochentag usw.

Hoffe, dass hilft!

2

Der einfachste Weg ist wahrscheinlich, eine Datumstabelle zu erstellen, die Monate und Jahre enthält und diese mit Ihrem Endergebnis zu verbinden.

+0

Vielen Dank für Ihre Antwort, aber brauche ich wirklich eine Tabelle mit allen möglichen Daten? Das kann nicht der einfachste Weg sein! :) –

+0

Es ist schwer, Werte zurückzugeben, die nicht existieren. :) –

+0

Guter Punkt Lieven, aber MySQL weiß über alle Daten auswendig, wenn gewöhnliche GetDate() und DateAdd() usw. verwendet werden. Ich denke nur, dass es eine Weise geben muss, sie zu holen! –

Verwandte Themen