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

Làm cách nào để thêm một vài giới hạn vào một truy vấn?

Tôi hiểu câu hỏi của bạn như thế này. Bạn đã có 3 người dùng (user_id =1,2,3) đăng nhập trong khoảng thời gian 01.01.2018-12.01.2018. Trong số những người dùng đó, user_id 1 đã thực hiện 2 thanh toán với tổng số tiền là 250, user_id 2 đã thực hiện 1 thanh toán với 40 và user_id 3 đã thực hiện 0 thanh toán nên tổng của họ là 0. Do đó có 2 giá trị trong phạm vi 0-200 và 1 trong phạm vi 200 + . Nếu đó là cách hiểu chính xác, truy vấn này sẽ cho bạn kết quả mong muốn:

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason;

Đầu ra:

diapason    number_of_users
0-200       2
200 +       1

Bản trình diễn SQLFiddle

Cập nhật

Để thêm một hàng khác với tổng số number_of_users , chỉ cần thêm WITH ROLLUP vào GROUP BY mệnh đề:

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason WITH ROLLUP

Đầu ra:

diapason    number_of_users
0-200       2
200 +       1
(null)      3

Trong khuôn khổ ứng dụng của mình, bạn có thể sử dụng thực tế là diapason giá trị là NULL để xuất ra một cái gì đó như Total thay vào đó.

SQLFiddle cập nhật

Bạn cũng có thể thực hiện tương tự trong MySQL (xem SQLFiddle này ) bằng cách gói truy vấn này thành một truy vấn con và sử dụng COALESCE trên diapason cột. Trong trường hợp đó, kết quả đầu ra sẽ là:

diapason    number_of_users
0-200       2
200 +       1
Total       3


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa các bản ghi cũ hơn một tháng / 30 ngày

  2. Tạo các lớp C # dựa trên bảng MySQL

  3. Phân tích cú pháp CSV và xuất vào cơ sở dữ liệu Mysql trong Grails

  4. Vấn đề kỳ lạ trong Python + MySQLdb

  5. Làm cách nào để sử dụng AES_ENCRYPT đúng cách?