Saya memahami pertanyaan Anda seperti ini. Anda memiliki 3 pengguna (user_id=1,2,3) login pada periode 01.01.2018-12.01.2018. Dari pengguna tersebut, user_id 1 melakukan 2 pembayaran dengan total 250, user_id 2 melakukan 1 pembayaran sebesar 40, dan user_id 3 melakukan 0 pembayaran sehingga totalnya adalah 0. Jadi ada 2 nilai dalam rentang 0-200
, dan 1 dalam rentang 200 +
. Jika itu pemahaman yang benar, kueri ini akan memberi Anda hasil yang diinginkan:
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;
Keluaran:
diapason number_of_users
0-200 2
200 + 1
Perbarui
Untuk menambahkan baris lain dengan total number_of_users
, cukup tambahkan WITH ROLLUP
ke GROUP BY
klausa:
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
Keluaran:
diapason number_of_users
0-200 2
200 + 1
(null) 3
Dalam kerangka kerja aplikasi Anda, Anda dapat menggunakan fakta bahwa diapason
nilainya adalah NULL
untuk menampilkan sesuatu seperti Total
sebagai gantinya.
Anda juga dapat melakukan hal yang sama di MySQL (lihat SQLFiddle
ini ) dengan membungkus kueri ini sebagai subkueri dan menggunakan COALESCE
pada diapason
kolom. Dalam hal ini outputnya adalah:
diapason number_of_users
0-200 2
200 + 1
Total 3