Разбирам въпроса ви така. Имахте 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. Следователно има 2 стойности в диапазона 0-200
и 1 в диапазона 200 +
. Ако това е правилното разбиране, тази заявка ще ви даде желаните резултати:
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
Актуализация
За да добавите още един ред с общия 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
вместо това.
Можете също да направите същото в MySQL (вижте този SQLFiddle
), като обгърнете тази заявка като подзаявка и използвате COALESCE
на diapason
колона. В този случай резултатът ще бъде:
diapason number_of_users
0-200 2
200 + 1
Total 3