Per far fronte ai mesi mancanti, crea una tabella modello a cui unirti.
Pensalo come una memorizzazione nella cache. Invece di scorrere e colmare le lacune, basta avere un calendario memorizzato nella cache del database.
Puoi anche combinare più calendari (inizio mese, inizio settimana, giorni festivi, giorno lavorativo, ecc.) in un'unica tabella, con una serie di flag e indici di ricerca.
Finisci con qualcosa come...
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
MODIFICA
Ho appena notato che l'OP vuole un totale parziale.
Questo -è- possibile in SQL ma è estremamente inefficiente. Il motivo è che il risultato di un mese non viene utilizzato per calcolare il mese successivo. Invece l'intero totale parziale deve essere calcolato di nuovo.
Per questo motivo è normalmente consigliabile calcolare il totale mensile come sopra, quindi utilizzare l'applicazione per scorrere e creare i valori del totale parziale.
Se davvero deve farlo in SQL, sarebbe qualcosa del tipo...
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