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
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 đó.
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