Aby uzupełnić brakujące miesiące, utwórz tabelę szablonów, do której chcesz dołączyć.
Pomyśl o tym jako o buforowaniu. Zamiast przeglądać i wypełniać luki, po prostu umieść kalendarz w pamięci podręcznej w swojej bazie danych.
Możesz nawet połączyć wiele kalendarzy (początek miesiąca, początek tygodnia, dni ustawowo wolne od pracy, dzień roboczy itp.) w jednej tabeli z kilkoma flagami wyszukiwania i indeksami.
Otrzymujesz coś takiego jak...
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
EDYTUJ
Właśnie zauważyłem, że OP chce mieć bieżącą sumę.
Jest to możliwe w SQL, ale niezwykle nieskuteczny. Powodem jest to, że wynik z jednego miesiąca nie jest używany do obliczania następnego miesiąca. Zamiast tego należy ponownie obliczyć całą bieżącą sumę.
Z tego powodu zwykle zdecydowanie zaleca się obliczenie miesięcznej sumy jak powyżej, a następnie użycie aplikacji do iteracji i utworzenia bieżących wartości sumarycznych.
Jeśli naprawdę musi to zrobić w SQL, byłoby to coś w stylu...
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