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

Introduktion af en ny kolonne for forrige måneds sum

To ting.

For det første, hvis du holder op med at bruge WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) for at vælge dine datoer får du tre fordele.

  1. Din datosøgning bliver sargable :et indeks vil fremskynde det.
  2. Du får en mere generel ordning for valg af måneder.
  3. Hvis du har flere års data i dine tabeller, vil tingene fungere bedre.

Brug i stedet generelt denne form for udtryk til at søge efter den nuværende måned. Du har allerede fundet ud af det meste af dette.

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

Dette ser efter alle datetime-værdier på eller efter midnat på den første dag i denne måned og før, men ikke på < , midnat den første dag i næste måned.

Det generaliserer til enhver måned, du ønsker. For eksempel

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

får dig sidste måned. Dette fungerer også, når den aktuelle måned er januar, og det virker, når du har flere års data i dine tabeller.

Disse udtryk er lidt ordrette, fordi MySQL ikke har en FIRST_DAY(date) funktion, kun a LAST_DAY(date) funktion . Så vi har brug for alle der + INTERVAL 1 DAY abevirksomhed .

For det andet er udtrækning af en tidligere måneds data lige så simpelt som at tilføje endnu en LEFT JOIN ( SELECT... klausul til dit bord, sådan. (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

Som du kan se, er datointervallet WHERE klausul her får den foregående måneds rækker.




  1. Hvad er meningen med, at lagrede procedurer er prækompileret?

  2. MySQL langsom forespørgselslog logføring af hurtige forespørgsler

  3. MySQL-hjælp:Sådan finder du alle ordrer fra en kunde indtil pris <=20 og status='ubetalt'

  4. MySQL REGEXP eksempler