sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo agregar algunas restricciones a una consulta?

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

Demostración de SQLFiddle

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.

SQLFiddle actualizado

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