Entiendo tu pregunta así. Tuviste 3 usuarios (user_id=1,2,3) que iniciaron sesión en el período 01.01.2018-12.01.2018. De esos usuarios, user_id 1 realizó 2 pagos por un total de 250, user_id 2 realizó 1 pago de 40 y user_id 3 realizó 0 pagos, por lo que su total es 0. Por lo tanto, hay 2 valores en el rango 0-200 , y 1 en el rango 200 + . Si ese es el entendimiento correcto, esta consulta le dará los resultados deseados:
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;
Salida:
diapason number_of_users
0-200 2
200 + 1
Actualizar
Para agregar otra fila con el total de number_of_users , simplemente agregue WITH ROLLUP al GROUP BY cláusula:
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
Salida:
diapason number_of_users
0-200 2
200 + 1
(null) 3
En el marco de su aplicación, puede usar el hecho de que diapason el valor es NULL para generar algo como Total en su lugar.
También puede hacer lo mismo en MySQL (consulte este SQLFiddle
) envolviendo esta consulta como una subconsulta y usando COALESCE en el diapason columna. En ese caso, la salida sería:
diapason number_of_users
0-200 2
200 + 1
Total 3