sql >> Database >  >> RDS >> Mysql

Introductie van een nieuwe kolom voor de som van de vorige maand

Twee dingen.

Ten eerste, als u stopt met het gebruik van WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) om uw datums te kiezen, krijgt u drie voordelen.

  1. Uw datum zoeken wordt sargable :een index zal het versnellen.
  2. Je krijgt een meer algemeen schema voor het kiezen van maanden.
  3. Als u meerdere jaren aan gegevens in uw tabellen heeft, zal alles beter werken.

Gebruik in plaats daarvan in het algemeen dit soort uitdrukking om naar de huidige maand te zoeken. Je hebt het meeste hiervan al ontdekt.

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

Dit zoekt naar alle datetime-waarden op of na middernacht op de eerste dag van de huidige maand, en eerder, maar niet op < , middernacht op de eerste dag van de volgende maand.

Het generaliseert naar elke gewenste maand. Bijvoorbeeld

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

krijgt je vorige maand. Dit werkt ook als de huidige maand januari is, en het werkt ook als je meerdere jaren aan gegevens in je tabellen hebt staan.

Deze uitdrukkingen zijn een beetje uitgebreid omdat MySQL geen FIRST_DAY(date) heeft functie, alleen a LAST_DAY(date) functie . We hebben dus alle die + INTERVAL 1 DAY apenzaken .

Ten tweede is het uittrekken van de gegevens van een vorige maand net zo eenvoudig als het toevoegen van nog een LEFT JOIN ( SELECT... clausule aan uw tafel, zoals zo. (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

Zoals je kunt zien, is de periode WHERE clausule hier krijgt de rijen van de vorige maand.




  1. SELECTEER WAAR IN (subquery) traag

  2. Hoe maak ik een externe sleutel in SQL Server?

  3. MySQL-query ORDER OP bepaalde waarden vóór andere

  4. Top 7 banen die SQL vereisen