Para cubrir los meses faltantes, cree una tabla de plantilla para unirse.
Piense en ello como almacenamiento en caché. En lugar de recorrer y llenar los vacíos, simplemente tenga un calendario almacenado en caché en su base de datos.
Incluso puede combinar varios calendarios (inicio de mes, inicio de semana, días festivos, días laborables, etc.) en una sola tabla, con un montón de índices y banderas de búsqueda.
Terminas con algo como...
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
EDITAR
Acabo de darme cuenta de que el OP quiere un total acumulado.
Esto -es- posible en SQL pero es extremadamente ineficiente. El motivo es que el resultado de un mes no se utiliza para calcular el mes siguiente. En su lugar, el total acumulado completo debe calcularse nuevamente.
Por esta razón, normalmente se recomienda encarecidamente que calcule el total mensual como se indicó anteriormente, luego use su aplicación para iterar y obtener los valores totales acumulados.
Si realmente debe hacerlo en SQL, sería algo como...
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