Chcete-li pokrýt chybějící měsíce, vytvořte šablonu tabulky, ke které se připojíte.
Berte to jako ukládání do mezipaměti. Místo procházení a vyplňování mezer stačí mít kalendář uložený ve své databázi.
Můžete dokonce zkombinovat více kalendářů (začátek měsíce, začátek týdne, státní svátky, pracovní den atd.) do jedné tabulky se spoustou příznaků vyhledávání a indexů.
Skončíte s něčím jako...
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
UPRAVIT
Právě jsem si všiml, že OP chce průběžný součet.
To -je- možné v SQL, ale je to extrémně neefektivní. Důvodem je, že výsledek z jednoho měsíce se nepoužije pro výpočet následujícího měsíce. Místo toho je třeba znovu vypočítat celý průběžný součet.
Z tohoto důvodu se obvykle důrazně doporučuje vypočítat měsíční součet výše uvedeným způsobem a poté pomocí aplikace procházet a vytvářet průběžné celkové hodnoty.
Pokud opravdu musí to udělat v SQL, bylo by to něco jako...
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