Mysql
 sql >> Base de données >  >> RDS >> Mysql

Introduction d'une nouvelle colonne pour la somme du mois précédent

Deux choses.

Tout d'abord, si vous arrêtez d'utiliser WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) pour choisir vos dates, vous bénéficierez de trois avantages.

  1. Votre recherche de date deviendra sargable :un index l'accélérera.
  2. Vous obtiendrez un schéma plus général pour choisir les mois.
  3. Si vous avez plusieurs années de données dans vos tableaux, les choses fonctionneront mieux.

Au lieu de cela, utilisez généralement ce type d'expression pour rechercher le mois en cours. Vous avez déjà compris la plupart de cela.

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

Cela recherche toutes les valeurs datetime à ou après minuit le premier jour du mois en cours, et avant, mais pas sur < , minuit le premier jour du mois suivant.

Il se généralise à n'importe quel mois que vous voulez. Par exemple,

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

vous reçoit le mois dernier. Cela fonctionne également lorsque le mois en cours est janvier, et cela fonctionne lorsque vous avez plusieurs années de données dans vos tables.

Ces expressions sont un peu verbeuses car MySQL n'a pas de FIRST_DAY(date) fonction, seulement a LAST_DAY(date) fonction . Nous avons donc besoin de tous les qui + INTERVAL 1 DAY affaire de singe .

Deuxièmement, extraire les données d'un mois précédent est aussi simple que d'ajouter un autre LEFT JOIN ( SELECT... clause à votre table, comme ça. (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

Comme vous pouvez le voir, la plage de dates WHERE clause ici obtient les lignes du mois précédent.