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

Introduzione di una nuova colonna per la somma del mese precedente

Due cose.

Innanzitutto, se smetti di usare WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) per scegliere le date avrai tre vantaggi.

  1. La tua ricerca sulla data diventerà sargable :un indice lo velocizzerà.
  2. Otterrai uno schema più generale per la scelta dei mesi.
  3. Se nelle tue tabelle hai più anni di dati, le cose funzioneranno meglio.

Invece, in generale, usa questo tipo di espressione per cercare il mese in corso. Hai già capito la maggior parte di questo.

WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
  AND wydatki.data_zakupu  < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 0 MONTH

Cerca tutti i valori datetime alla mezzanotte o dopo la mezzanotte del primo giorno del mese in corso e prima, ma non in < , mezzanotte del primo giorno del mese successivo.

Si generalizza a qualsiasi mese tu voglia. Ad esempio,

WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
  AND wydatki.data_zakupu  < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH

ti prende il mese scorso. Funziona anche quando il mese corrente è gennaio e funziona quando nelle tabelle sono presenti dati per più anni.

Queste espressioni sono un po' dettagliate perché MySQL non ha un FIRST_DAY(date) funzione, solo a LAST_DAY(date) funzione . Quindi abbiamo bisogno di tutte le che + INTERVAL 1 DAY affari delle scimmie .

In secondo luogo, estrarre i dati di un mese precedente è semplice come aggiungere un altro LEFT JOIN ( SELECT... clausola al tuo tavolo, in questo modo. (http://sqlfiddle.com/#!9/676df4/13 )

SELECT ...
       coalesce(month1.tot, 0) AS LastMonth           
FROM wydatki_kategorie cat
LEFT JOIN 
      ...
LEFT JOIN
  (SELECT wydatki_wpisy.kategoria,
          sum(wydatki_wpisy.brutto) AS tot
   FROM wydatki_wpisy
   LEFT JOIN wydatki ON wydatki_wpisy.do_wydatku = wydatki.id_wydatku
   WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
     AND wydatki.data_zakupu  < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
     AND wydatki.id_kupujacy = 1
   GROUP BY wydatki_wpisy.kategoria
  ) month1 ON cat.id_kat = month1.kategoria

Come puoi vedere, l'intervallo di date WHERE la clausola qui ottiene le righe del mese precedente.