欠落している月に対応するには、結合するテンプレート テーブルを作成します。
キャッシングと考えてください。ループしてギャップを埋めるのではなく、カレンダーをデータベースにキャッシュするだけです。
複数のカレンダー (月の始まり、週の始まり、祝日、営業日など) をすべて 1 つのテーブルにまとめて、多数の検索フラグとインデックスを使用することもできます。
あなたは次のようなものになります...
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
編集
OPが現在の合計を必要としていることに気付きました。
これは 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