Si desea la proporción de usuarios que han realizado pagos a los que tienen actividad, simplemente resuma cada tabla 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:
Necesita una tabla con todas las fechas en el rango. Ese es el mayor problema.
Entonces recomendaría:
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:
- Esto devuelve
NULL
en los días que no hay actividad. Eso tiene más sentido para mí que0
. - Esto usa lógica en las fechas que funciona tanto para fechas como para valores de fecha/hora.
- La lógica de las fechas puede hacer uso de un índice, que puede ser importante para este tipo de consulta.
- No recomiendo usar
LEFT JOIN
s. Eso multiplicará los datos que pueden encarecer la consulta.