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

Como calcular por cento?


Se você deseja a proporção de usuários que efetuaram pagamentos para aqueles com atividade, basta resumir cada tabela individualmente:
select p.cnt / a.cnt
from (select count(distinct user_id) as cnt from activity a) a cross join
     (select count(distinct user_id) as cnt from payment) p;

EDITAR:

Você precisa de uma tabela com todas as datas no intervalo. Esse é o maior problema.

Então eu recomendaria:
SELECT d.dte,
       ( ( SELECT COUNT(DISTINCT p.user_id)
           FROM payments p
           WHERE p.payment_date >= d.dte and p.payment_date < d.dte + INTERVAL 1 DAY
          ) /
          NULLIF( (SELECT COUNT(DISTINCT a.user_id)
                   FROM activity a
                   WHERE a.login_time >= d.dte and p.login_time < d.dte + INTERVAL 1 DAY
                  ), 0
                 ) as ratio
FROM (SELECT date('2017-01-01') dte UNION ALL
      SELECT date('2017-01-02') dte UNION ALL
      SELECT date('2017-01-03') dte UNION ALL
      SELECT date('2017-01-04') dte UNION ALL
      SELECT date('2017-01-05') dte 
     ) d;

Notas:
  • Isso retorna NULL nos dias em que não há atividade. Isso faz mais sentido para mim do que 0 .
  • Isso usa lógica nas datas que funciona tanto para datas quanto para valores de data/hora.
  • A lógica para datas pode usar um índice, o que pode ser importante para esse tipo de consulta.
  • Não recomendo usar LEFT JOIN s. Isso multiplicará os dados que podem tornar a consulta cara.