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