Pour répondre aux mois manquants, créez un modèle de table à joindre.
Considérez cela comme une mise en cache. Plutôt que de parcourir et de combler les lacunes, mettez simplement un calendrier en cache dans votre base de données.
Vous pouvez même combiner plusieurs calendriers (début de mois, début de semaine, jours fériés, jours ouvrés, etc.) dans un seul tableau, avec un tas d'indicateurs de recherche et d'index.
Vous vous retrouvez avec quelque chose comme...
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
MODIFIER
Je viens de remarquer que l'OP veut un total cumulé.
Ceci -est- possible en SQL mais c'est extrêmement inefficace. La raison étant que le résultat d'un mois n'est pas utilisé pour calculer le mois suivant. Au lieu de cela, le total cumulé doit être recalculé.
Pour cette raison, il est normalement fortement recommandé de calculer le total mensuel comme ci-dessus, puis d'utiliser votre application pour parcourir et créer les valeurs totales cumulées.
Si vous vraiment doit le faire en SQL, ce serait quelque chose comme...
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