sql >> データベース >  >> RDS >> Mysql

前月の合計の新しい列を紹介します

    2つのこと。

    まず、 WHERE MONTH(wydatki.data_zakupu)=MONTH(CURRENT_DATE())の使用を停止した場合 日付を選択すると、3つのメリットがあります。

    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
    

    これは、当月の初日の午前0時以降、およびそれ以前のすべての日時値を検索しますが、<は検索しません。 、翌月初日の深夜。

    それはあなたが望むどんな月にも一般化します。たとえば、

    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
    

    先月あなたを取得します。これは、現在の月が1月の場合にも機能し、テーブルに複数年分のデータがある場合にも機能します。

    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. PHPでデータベースにすでに追加されているPDFファイルを更新するにはどうすればよいですか?

    2. 4つの主要なデータベースIDEツールを比較する

    3. EFが不要なヌルチェックを使用してSQLクエリを生成するのはなぜですか?

    4. CodeIgniterフレームワークを使用して配列から複数の行を挿入するにはどうすればよいですか?