Я понимаю ваш вопрос как этот. Вы имели 3 пользователей (user_id = 1,2,3) логин в период 01.01.2018-12.01.2018. Из этих пользователей user_id 1 совершил 2 платежа на общую сумму 250, user_id 2 осуществил 1 платеж из 40, а user_id 3 произвел 0 платежей, поэтому их общее количество равно 0. Следовательно, в диапазоне 0-200
есть 2 значения, а в диапазоне * 1 1002 *. Если это правильное понимание, этот запрос даст вам желаемые результаты:
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;
Выход:
diapason number_of_users
0-200 2
200 + 1
Демонстрация SQLFiddle
Обновление
Чтобы добавить еще одну строку с итогом number_of_users
, просто добавьте WITH ROLLUP
к предложению GROUP BY
:
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
Выход:
diapason number_of_users
0-200 2
200 + 1
(null) 3
В вашей среде приложения вы можете использовать тот факт, что значение diapason
равно NULL
, чтобы вывести что-то вроде Total
.
Обновлен SQLFiddle
Вы также можете сделать то же самое в MySQL (см. SQLFiddle ), заключив этот запрос в подзапрос и используя COALESCE
в столбце diapason
. В этом случае вывод будет:
diapason number_of_users
0-200 2
200 + 1
Total 3