Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Giới thiệu một cột mới cho tổng tháng trước

Hai điều.

Đầu tiên, nếu bạn ngừng sử dụng WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) để chọn ngày của bạn, bạn sẽ nhận được ba lợi ích.

  1. Ngày tìm kiếm của bạn sẽ trở thành sargable :một chỉ mục sẽ tăng tốc.
  2. Bạn sẽ nhận được sơ đồ tổng quát hơn để chọn tháng.
  3. Nếu bạn có nhiều năm dữ liệu trong bảng của mình, mọi thứ sẽ hoạt động tốt hơn.

Thay vào đó, nói chung sử dụng loại biểu thức này để tìm kiếm tháng hiện tại. Bạn đã tìm ra hầu hết điều này.

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

Điều này tìm kiếm tất cả các giá trị ngày giờ vào hoặc sau nửa đêm của ngày đầu tiên của tháng hiện tại và trước đó, nhưng không tìm kiếm trên < , nửa đêm của ngày đầu tiên của tháng sau.

Nó tổng quát cho bất kỳ tháng nào bạn muốn. Ví dụ,

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

có được bạn vào tháng trước. Điều này cũng hoạt động khi tháng hiện tại là tháng 1 và nó hoạt động khi bạn có giá trị dữ liệu nhiều năm trong bảng của mình.

Các biểu thức này hơi dài dòng vì MySQL không có FIRST_DAY(date) chức năng, chỉ a LAST_DAY(date) chức năng . Vì vậy, chúng tôi cần tất cả điều đó + INTERVAL 1 DAY kinh doanh khỉ .

Thứ hai, việc lấy ra dữ liệu của tháng trước cũng đơn giản như thêm một LEFT JOIN ( SELECT... cho bảng của bạn, như vậy. ( 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

Như bạn có thể thấy, phạm vi ngày WHERE mệnh đề ở đây lấy các hàng của tháng trước.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mức độ liên quan của tìm kiếm toàn văn bản Mysql trên nhiều bảng

  2. Làm cách nào để kết nối với cơ sở dữ liệu MySQL từ iPhone?

  3. mysql:cách cắt bớt độ dài của một trường

  4. Thử thách truy vấn MYSQL một bảng, hai cột

  5. Quyền truy cập bị Từ chối đối với Người dùng 'root' @ 'localhost' (sử dụng mật khẩu:CÓ) - Không có Đặc quyền?