Mysql
 sql >> база данни >  >> RDS >> Mysql

Въвеждане на нова колона за сумата от предходния месец

Две неща.

Първо, ако спрете да използвате WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) за да изберете датите си, ще получите три предимства.

  1. Вашето търсене по дата ще стане с възможност за sargable :индекс ще го ускори.
  2. Ще получите по-обща схема за избор на месеци.
  3. Ако имате данни за няколко години във вашите таблици, нещата ще работят по-добре.

Вместо това по принцип използвайте този вид израз за търсене на настоящия месец. Вече разбрахте повечето от това.

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

Това търси всички стойности за дата и час на или след полунощ на първия ден от настоящия месец и преди, но не и на < , полунощ на първия ден на следващия месец.

Обобщава се за всеки месец, който искате. Например

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

получава миналия месец. Това също работи, когато текущият месец е януари, и работи, когато имате данни за няколко години във вашите таблици.

Тези изрази са малко подробни, защото MySQL няма FIRST_DAY(date) функция, само a LAST_DAY(date) функция . Така че имаме нужда от всички които + INTERVAL 1 DAY маймунски бизнес .

Второ, извличането на данни от предходния месец е толкова просто, колкото добавянето на друго LEFT JOIN ( SELECT... клауза към вашата маса, така. (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

Както можете да видите, периодът от време WHERE клаузата тук получава редовете от предходния месец.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Показване на данни от MYSQL; Грешка в SQL израза

  2. Изберете потребители от една таблица само ако не и от друга

  3. mysql:изберете, вмъкнете, изтрийте и актуализирайте в една заявка

  4. качете файл в MySql DB с PHP

  5. vBulletin като вход за целия уебсайт (редактиране:постигнат е известен напредък)