Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wprowadzenie nowej kolumny dla sumy z poprzedniego miesiąca

Dwie rzeczy.

Po pierwsze, jeśli przestaniesz używać WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) aby wybrać daty, uzyskasz trzy korzyści.

  1. Wyszukiwanie dat będzie możliwe do sargowania :indeks przyspieszy to.
  2. Uzyskasz bardziej ogólny schemat wyboru miesięcy.
  3. Jeśli masz w tabelach dane z wielu lat, wszystko będzie działać lepiej.

Zamiast tego na ogół używaj tego rodzaju wyrażenia do wyszukiwania bieżącego miesiąca. Większość już się zorientowałeś.

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

Wyszukuje wszystkie wartości daty i godziny w dniu lub po północy pierwszego dnia bieżącego miesiąca i wcześniej, ale nie w dniu < , północ pierwszego dnia następnego miesiąca.

Uogólnia się na dowolny miesiąc. Na przykład

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

dostał cię w zeszłym miesiącu. Działa to również, gdy bieżącym miesiącem jest styczeń, i działa, gdy masz w tabelach dane z wielu lat.

Te wyrażenia są trochę gadatliwe, ponieważ MySQL nie ma FIRST_DAY(date) funkcja, tylko a LAST_DAY(date) funkcja . Więc potrzebujemy wszystkich że + INTERVAL 1 DAY małpi biznes .

Po drugie, wyciągnięcie danych z poprzedniego miesiąca jest tak proste, jak dodanie kolejnego LEFT JOIN ( SELECT... klauzulę do twojego stołu, tak jak. (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 widać, zakres dat WHERE klauzula tutaj pobiera wiersze z poprzedniego miesiąca.




  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 zlicza wiersze za pomocą filtrów w bazie danych o dużym natężeniu ruchu

  2. Laravel 4.2 :Limit czasu MYSQL. Gdzie globalnie zmienić czas

  3. Konwertuj javascript na obiekt daty na format daty mysql (RRRR-MM-DD)

  4. Błąd wyrażenia ścieżki MySQL JSON_EXTRACT

  5. Jaki jest najlepszy sposób na dwukierunkową synchronizację danych dynamicznych w czasie rzeczywistym za pomocą mysql