sql >> Databasteknik >  >> RDS >> Mysql

Totalt löper över datumintervallet – fyll i de datum som saknas

För att ta hand om månader som saknas, skapa en malltabell att gå med i.

Se det som cachning. Istället för att gå igenom och fylla luckor, ha bara en kalender cachad i din databas.

Du kan till och med kombinera flera kalendrar (månadens början, veckans början, helgdagar, arbetsdagar, etc.) allt i en tabell, med ett gäng sökflaggor och index.

Du får något i stil med...

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

REDIGERA

Jag märkte precis att OP vill ha en löpande summa.

Detta -är- möjligt i SQL men det är extremt ineffektiv. Anledningen är att resultatet från en månad inte används för att beräkna följande månad. Istället måste hela den löpande summan beräknas igen.

Av denna anledning rekommenderas det normalt starkt att du beräknar månadssumman enligt ovan och sedan använder din applikation för att gå igenom och göra de löpande totala värdena.

Om du verkligen måste göra det i SQL, det skulle vara något i stil med...

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. Mapping array med Hibernate

  2. Mysql Beräkna tidsskillnaden mellan tidsstämplar i samma fält?

  3. Hur man ställer in värdet på det sammansatta variabelfältet med hjälp av dynamisk SQL

  4. FLUTTER&PHP - Jag kan inte skicka inlägg till mysql-databasen från min flutter-app