For at tage højde for manglende måneder skal du oprette en skabelontabel, som du kan deltage i.
Tænk på det som caching. I stedet for at gå igennem og udfylde huller, skal du bare have en kalender cachelagret i din database.
Du kan endda kombinere flere kalendere (begyndelsen af måneden, starten af ugen, helligdage, arbejdsdage osv.) i én tabel med en masse søgeflag og indekser.
Du ender med noget som...
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
REDIGER
Jeg har lige bemærket, at OP ønsker en løbende total.
Dette -er- muligt i SQL, men det er ekstremt ineffektiv. Årsagen er, at resultatet fra en måned ikke bruges til at beregne den følgende måned. I stedet skal hele den løbende sum beregnes igen.
Af denne grund anbefales det normalt kraftigt, at du beregner den månedlige total som ovenfor, og derefter bruger din applikation til at gå igennem og lave de løbende samlede værdier.
Hvis du virkelig skal gøre det i SQL, ville det være noget 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