sql >> Database >  >> RDS >> Mysql

Lopend totaal over datumbereik - vul de ontbrekende datums in

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


  1. Wat is de juiste en veilige manier om een ​​gebruiker ingelogd te houden? koekjes? sessie? PHP &&MYSQL

  2. Gebruik MySQL ruimtelijke extensies om punten binnen een cirkel te selecteren

  3. MYSQL - Gegevens selecteren uit de tweede rij in een grote tabel

  4. Bepaal het volgende nummer in de databasequery met while-lus in php