Mysql
 sql >> Base de données >  >> RDS >> Mysql

Total cumulé sur la plage de dates - remplissez les dates manquantes

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