Если вы хотите, чтобы соотношение пользователей, совершивших платежи, к числу пользователей, выполняющих действия, просто суммируйте каждую таблицу в отдельности:
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;
EDIT:
Вам нужна таблица со всеми датами в диапазоне. Это самая большая проблема.
Тогда я бы порекомендовал:
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;
Примечания:
- Возвращает
NULL
в дни, когда нет активности. Это имеет больше смысла для меня, чем 0
.
- Используется логика для дат, которая работает как для дат, так и для значений даты / времени.
- Логика для дат может использовать индекс, который может быть важен для этого типа запроса.
- Я не рекомендую использовать
LEFT JOIN
s. Это умножит данные, что может сделать запрос дорогим.