För att ta hand om månader som saknas, skapa en malltabell att gå med i.
Se det som cachning. Istället för att gå igenom och fylla luckor, ha bara en kalender cachad i din databas.
Du kan till och med kombinera flera kalendrar (månadens början, veckans början, helgdagar, arbetsdagar, etc.) allt i en tabell, med ett gäng sökflaggor och index.
Du får något i stil med...
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
REDIGERA
Jag märkte precis att OP vill ha en löpande summa.
Detta -är- möjligt i SQL men det är extremt ineffektiv. Anledningen är att resultatet från en månad inte används för att beräkna följande månad. Istället måste hela den löpande summan beräknas igen.
Av denna anledning rekommenderas det normalt starkt att du beräknar månadssumman enligt ovan och sedan använder din applikation för att gå igenom och göra de löpande totala värdena.
Om du verkligen måste göra det i SQL, det skulle vara något i stil med...
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