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

Laufende Summe über den Datumsbereich - füllen Sie die fehlenden Daten aus

Um fehlende Monate auszugleichen, erstellen Sie eine Vorlagentabelle, mit der Sie sich verbinden können.

Betrachten Sie es als Caching. Anstatt Lücken zu durchlaufen und zu füllen, haben Sie einfach einen Kalender in Ihrer Datenbank zwischengespeichert.

Sie können sogar mehrere Kalender (Monatsanfang, Wochenanfang, Feiertage, Arbeitstage usw.) in einer Tabelle mit einer Reihe von Suchmarkierungen und Indizes kombinieren.

Sie enden mit etwas wie...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= calendar.date
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= '20110101'
  AND calendar.date <  '20120101'
GROUP BY
  calendar.date

BEARBEITEN

Mir ist gerade aufgefallen, dass das OP eine laufende Summe haben möchte.

Dies -ist- in SQL möglich, aber extrem ineffizient. Der Grund dafür ist, dass das Ergebnis eines Monats nicht zur Berechnung des Folgemonats verwendet wird. Stattdessen muss die gesamte laufende Summe neu berechnet werden.

Aus diesem Grund wird normalerweise dringend empfohlen, dass Sie die monatliche Gesamtsumme wie oben beschrieben berechnen und dann mit Ihrer Anwendung iterieren und die laufenden Gesamtwerte erstellen.

Wenn Sie wirklich muss es in SQL tun, es wäre so etwas wie ...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= @yourFirstDate
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= @yourFirstDate
  AND calendar.date <  @yourLastDate
GROUP BY
  calendar.date