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