Чтобы учесть пропущенные месяцы, создайте таблицу шаблонов для объединения.
Думайте об этом как о кешировании. Вместо того, чтобы перебирать и заполнять пробелы, просто поместите календарь в вашу базу данных.
Вы даже можете объединить несколько календарей (начало месяца, начало недели, праздничные дни, рабочий день и т. Д.) В одну таблицу с кучей поисковых флагов и индексов.
В итоге получается что-то вроде ...
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
EDIT
Я только что заметил, что ОП хочет получить промежуточный итог.
Это возможно в SQL, но крайне неэффективно. Причина в том, что результат одного месяца не используется для вычисления следующего месяца. Вместо этого весь промежуточный итог должен быть снова рассчитан.
По этой причине, как правило, настоятельно рекомендуется рассчитать месячную сумму, как указано выше, а затем использовать свое приложение для ее прохождения и получения значений промежуточных итогов.
Если вы действительно должны сделать это в SQL, это будет что-то вроде ...
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