Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Memperkenalkan kolom baru untuk jumlah bulan sebelumnya

Dua hal.

Pertama, jika Anda berhenti menggunakan WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) untuk memilih tanggal, Anda akan mendapatkan tiga manfaat.

  1. Pencarian tanggal Anda akan menjadi sargable :indeks akan mempercepatnya.
  2. Anda akan mendapatkan skema yang lebih umum untuk memilih bulan.
  3. Jika Anda memiliki data selama beberapa tahun di tabel Anda, semuanya akan bekerja lebih baik.

Sebagai gantinya, secara umum gunakan ekspresi semacam ini untuk mencari bulan ini. Anda sudah mengetahui sebagian besar dari ini.

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

Ini mencari semua nilai waktu-tanggal pada atau setelah tengah malam pada hari pertama bulan ini, dan sebelumnya, tetapi tidak pada < , tengah malam pada hari pertama bulan depan.

Ini menggeneralisasi untuk setiap bulan yang Anda inginkan. Misalnya,

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

mendapatkan Anda bulan lalu. Ini juga berfungsi saat bulan berjalan adalah Januari, dan berfungsi saat Anda memiliki data selama beberapa tahun di tabel Anda.

Ekspresi ini sedikit bertele-tele karena MySQL tidak memiliki FIRST_DAY(date) fungsi, hanya a LAST_DAY(date) fungsi . Jadi kita membutuhkan semua itu + INTERVAL 1 DAY bisnis monyet .

Kedua, menarik data bulan sebelumnya semudah menambahkan LEFT JOIN ( SELECT... klausa ke meja Anda, seperti itu. (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

Seperti yang Anda lihat, rentang tanggal WHERE klausa di sini mendapatkan baris bulan sebelumnya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memperbarui data yang diubah ke dalam Database dengan menggunakan JTable?

  2. Memilih data tabel MySql ke dalam array

  3. Fungsi Buatan Pengguna MySQL untuk mengirim pesan windows

  4. Google Data Studio - Cloud SQL Untuk Kesalahan Konektor MySQL

  5. Mengapa saya mendapatkan 'Logging biner tidak mungkin.' di server MySQL saya?