Maak een sjabloontabel om aan mee te doen om te voorzien in ontbrekende maanden.
Zie het als cachen. In plaats van door te bladeren en gaten op te vullen, kunt u gewoon een agenda in uw database in de cache opslaan.
U kunt zelfs meerdere kalenders (begin van de maand, begin van de week, feestdagen, werkdag, enz.) combineren in één tabel, met een heleboel zoekvlaggen en indexen.
Je eindigt met zoiets als...
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
BEWERKEN
Ik heb net gemerkt dat de OP een lopend totaal wil.
Dit -is- mogelijk in SQL, maar het is uiterst inefficiënt. De reden hiervoor is dat het resultaat van de ene maand niet wordt gebruikt om de volgende maand te berekenen. In plaats daarvan moet het hele lopende totaal opnieuw worden berekend.
Om deze reden wordt het normaal gesproken sterk aanbevolen dat u het maandelijkse totaal berekent zoals hierboven, en vervolgens uw applicatie gebruikt om de lopende totaalwaarden te doorlopen en te maken.
Als je echt moet het in SQL doen, het zou zoiets zijn als...
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