Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einführung einer neuen Spalte für die Summe des Vormonats

Zwei Dinge.

Erstens, wenn Sie aufhören, WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) zu verwenden Um Ihre Daten auszuwählen, erhalten Sie drei Vorteile.

  1. Ihre Datumssuche wird sargable :ein Index wird es beschleunigen.
  2. Sie erhalten ein allgemeineres Schema zur Auswahl der Monate.
  3. Wenn Sie Daten aus mehreren Jahren in Ihren Tabellen haben, wird es besser funktionieren.

Verwenden Sie stattdessen im Allgemeinen diese Art von Ausdruck, um nach dem aktuellen Monat zu suchen. Sie haben das meiste davon bereits herausgefunden.

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

Dies sucht nach allen datetime-Werten am oder nach Mitternacht am ersten Tag des aktuellen Monats und davor, aber nicht am < , Mitternacht am ersten Tag des nächsten Monats.

Es verallgemeinert sich auf jeden gewünschten Monat. Beispiel:

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

bekommt Sie letzten Monat. Dies funktioniert auch, wenn der aktuelle Monat Januar ist, und es funktioniert, wenn Sie Daten aus mehreren Jahren in Ihren Tabellen haben.

Diese Ausdrücke sind etwas ausführlich, weil MySQL keinen FIRST_DAY(date) hat Funktion, nur a LAST_DAY(date) Funktion . Also brauchen wir alles das + INTERVAL 1 DAY Affengeschäft .

Zweitens ist das Herausziehen der Daten eines vorherigen Monats so einfach wie das Hinzufügen eines weiteren LEFT JOIN ( SELECT... Klausel zu Ihrem Tisch, so. (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

Wie Sie sehen können, ist der Datumsbereich WHERE -Klausel hier ruft die Zeilen des Vormonats ab.