sql >> Databáze >  >> RDS >> Mysql

Zavádí se nový sloupec pro součet za předchozí měsíc

Dvě věci.

Za prvé, pokud přestanete používat WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) při výběru data získáte tři výhody.

  1. Vaše vyhledávání data bude sargable :index to urychlí.
  2. Získáte obecnější schéma výběru měsíců.
  3. Pokud máte v tabulkách data za několik let, bude to fungovat lépe.

Místo toho obecně používejte tento druh výrazu k vyhledání aktuálního měsíce. Většinu z toho jste již pochopili.

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

Toto vyhledá všechny hodnoty data a času v nebo po půlnoci prvního dne aktuálního měsíce a dříve, ale ne na < , půlnoci prvního dne příštího měsíce.

Zobecňuje se na libovolný měsíc, který chcete. Například

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

dostane vás minulý měsíc. Funguje to také, když je aktuálním měsícem leden, a funguje to, když máte v tabulkách data za více let.

Tyto výrazy jsou trochu podrobné, protože MySQL nemá FIRST_DAY(date) funkce, pouze a LAST_DAY(date) funkce . Potřebujeme tedy všechny to + INTERVAL 1 DAY opičí byznys .

Za druhé, vytažení údajů za předchozí měsíc je stejně jednoduché jako přidání dalšího LEFT JOIN ( SELECT... klauzule k vašemu stolu, takhle. (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

Jak vidíte, časové období WHERE klauzule zde získá řádky za předchozí měsíc.




  1. Převeďte hodnotu sloupce odděleného čárkami na řádky

  2. po vytvoření jar souboru selže připojení k databázi

  3. Obecná chyba:Neshoda verze OS

  4. Jaký je nejlepší způsob připojení mezi androidem a databází Oracle?