Untuk memenuhi bulan yang hilang, buat tabel template untuk digabungkan.
Anggap saja sebagai caching. Daripada mengulang dan mengisi celah, cukup simpan kalender dalam cache di database Anda.
Anda bahkan dapat menggabungkan beberapa kalender (awal bulan, awal minggu, hari libur bank, hari kerja, dll) ke dalam satu tabel, dengan banyak tanda dan indeks pencarian.
Anda berakhir dengan sesuatu seperti...
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
Saya baru menyadari bahwa OP menginginkan total berjalan.
Ini -mungkin- dalam SQL tetapi sangat tidak efisien. Pasalnya, hasil satu bulan tidak digunakan untuk menghitung bulan berikutnya. Sebagai gantinya, total running-total harus dihitung lagi.
Untuk alasan ini Biasanya sangat disarankan agar Anda menghitung total bulanan seperti di atas, kemudian menggunakan aplikasi Anda untuk melakukan iterasi dan membuat nilai total berjalan.
Jika Anda sangat harus melakukannya dalam SQL, itu akan menjadi seperti...
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