Mysql
 sql >> Database >  >> RDS >> Mysql

Totale parziale nell'intervallo di date:inserisci le date mancanti

Per far fronte ai mesi mancanti, crea una tabella modello a cui unirti.

Pensalo come una memorizzazione nella cache. Invece di scorrere e colmare le lacune, basta avere un calendario memorizzato nella cache del database.

Puoi anche combinare più calendari (inizio mese, inizio settimana, giorni festivi, giorno lavorativo, ecc.) in un'unica tabella, con una serie di flag e indici di ricerca.

Finisci con qualcosa come...

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

MODIFICA

Ho appena notato che l'OP vuole un totale parziale.

Questo -è- possibile in SQL ma è estremamente inefficiente. Il motivo è che il risultato di un mese non viene utilizzato per calcolare il mese successivo. Invece l'intero totale parziale deve essere calcolato di nuovo.

Per questo motivo è normalmente consigliabile calcolare il totale mensile come sopra, quindi utilizzare l'applicazione per scorrere e creare i valori del totale parziale.

Se davvero deve farlo in SQL, sarebbe qualcosa del tipo...

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