sql >> Databasteknik >  >> RDS >> Mysql

Introducerar en ny kolumn för föregående månads summa

Två saker.

Först, om du slutar använda WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) för att välja dina datum får du tre förmåner.

  1. Din datumsökning blir sargable :ett index kommer att påskynda det.
  2. Du får ett mer allmänt schema för att välja månader.
  3. Om du har flera års data i dina tabeller kommer det att fungera bättre.

Använd istället i allmänhet den här typen av uttryck för att söka efter den aktuella månaden. Du har redan räknat ut det mesta.

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

Detta letar efter alla datetime-värden på eller efter midnatt den första dagen i den aktuella månaden och före, men inte på < , midnatt den första dagen i nästa månad.

Det generaliserar till vilken månad du vill. Till exempel,

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 förra månaden. Detta fungerar även när den aktuella månaden är januari, och det fungerar när du har flera års data i dina tabeller.

Dessa uttryck är lite utförliga eftersom MySQL inte har en FIRST_DAY(date) funktion, endast a LAST_DAY(date) funktion . Så vi behöver alla som + INTERVAL 1 DAY monkey business .

För det andra, att ta ut tidigare månads data är lika enkelt som att lägga till ytterligare en LEFT JOIN ( SELECT... klausul till ditt bord, som så. (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 är datumintervallet WHERE klausul här får föregående månads rader.




  1. Ingen användarinteraktivitet Kan jag fortfarande få SQL Injection

  2. Hur skriver man Hibernate Criteria för denna sql-fråga?

  3. Lås för SELECT så att en annan process inte får gamla data

  4. Orsakas av:android.database.sqlite.SQLiteException:ingen sådan tabell:(kod 1) Android