不足している月に対応するには、参加するテンプレートテーブルを作成します。
キャッシングと考えてください。ループしてギャップを埋めるのではなく、カレンダーをデータベースにキャッシュするだけです。
複数のカレンダー(月の初め、週の初め、銀行の休日、営業日など)をすべて、一連の検索フラグとインデックスを使用して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