Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment ajouter quelques restrictions à une requête ?

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

Démo SQLFiddle

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.

SQLFiddle mis à jour

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