Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como adicionar algumas restrições a uma consulta?


Eu entendo sua pergunta como esta. Você teve 3 usuários (user_id=1,2,3) login no período 01.01.2018-12.01.2018. Desses usuários, user_id 1 fez 2 pagamentos totalizando 250, user_id 2 fez 1 pagamento de 40 e user_id 3 fez 0 pagamentos, então o total é 0. Portanto, há 2 valores no intervalo 0-200 , e 1 no intervalo 200 + . Se esse for o entendimento correto, esta consulta fornecerá os resultados desejados:
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;

Resultado:
diapason    number_of_users
0-200       2
200 +       1

Demonstração do SQLFiddle

Atualizar

Para adicionar outra linha com o total de number_of_users , basta adicionar WITH ROLLUP para o 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

Resultado:
diapason    number_of_users
0-200       2
200 +       1
(null)      3

Na estrutura do seu aplicativo, você pode usar o fato de que o diapason valor é NULL para produzir algo como Total em vez de.

SQLFiddle atualizado

Você também pode fazer o mesmo no MySQL (veja este SQLFiddle ) envolvendo esta consulta como uma subconsulta e usando um COALESCE no diapason coluna. Nesse caso a saída seria:
diapason    number_of_users
0-200       2
200 +       1
Total       3