Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Apresentando uma nova coluna para a soma do mês anterior


Duas coisas.

Primeiro, se você parar de usar WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) para escolher suas datas você terá três benefícios.
  1. Sua pesquisa de data se tornará sargable :um índice irá acelerá-lo.
  2. Você terá um esquema mais geral para escolher os meses.
  3. Se você tiver dados de vários anos em suas tabelas, as coisas funcionarão melhor.

Em vez disso, em geral, use esse tipo de expressão para pesquisar o mês atual. Você já descobriu a maior parte disso.
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

Isso procura todos os valores de data e hora após a meia-noite do primeiro dia do mês atual e antes, mas não em < , meia-noite do primeiro dia do mês seguinte.

Ele generaliza para qualquer mês que você quiser. Por exemplo,
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

recebe você no mês passado. Isso também funciona quando o mês atual é janeiro e funciona quando você tem dados de vários anos em suas tabelas.

Essas expressões são um pouco detalhadas porque o MySQL não tem um FIRST_DAY(date) função, apenas um LAST_DAY(date) função . Portanto, precisamos de todos os que + INTERVAL 1 DAY negócio de macaco .

Segundo, extrair os dados de um mês anterior é tão simples quanto adicionar outro LEFT JOIN ( SELECT... cláusula para sua mesa, assim. (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

Como você pode ver, o intervalo de datas WHERE cláusula aqui obtém as linhas do mês anterior.