Je comprends votre question comme ceci. Vous avez eu 3 utilisateurs (user_id=1,2,3) connectés dans la période 01.01.2018-12.01.2018. Parmi ces utilisateurs, user_id 1 a effectué 2 paiements totalisant 250, user_id 2 a effectué 1 paiement de 40 et user_id 3 a effectué 0 paiement, leur total est donc de 0. Il y a donc 2 valeurs dans la plage 0-200
, et 1 dans la plage 200 +
. Si c'est la bonne compréhension, cette requête vous donnera les résultats souhaités :
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;
Sortie :
diapason number_of_users
0-200 2
200 + 1
Mettre à jour
Pour ajouter une autre ligne avec le total number_of_users
, ajoutez simplement WITH ROLLUP
au GROUP BY
clause :
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
Sortie :
diapason number_of_users
0-200 2
200 + 1
(null) 3
Dans votre framework applicatif vous pouvez utiliser le fait que le diapason
la valeur est NULL
pour afficher quelque chose comme Total
à la place.
Vous pouvez également faire la même chose dans MySQL (voir ceci SQLFiddle
) en enveloppant cette requête en tant que sous-requête et en utilisant un COALESCE
sur le diapason
colonne. Dans ce cas, la sortie serait :
diapason number_of_users
0-200 2
200 + 1
Total 3