Mysql
 sql >> Database >  >> RDS >> Mysql

Come calcolare la percentuale?

Se vuoi il rapporto tra utenti che hanno effettuato pagamenti e quelli con attività, riepiloghi ogni tabella singolarmente:

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;

MODIFICA:

Hai bisogno di una tabella con tutte le date nell'intervallo. Questo è il problema più grande.

Allora consiglierei:

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;

Note:

  • Questo restituisce NULL nei giorni in cui non c'è attività. Per me ha più senso di 0 .
  • Questo utilizza la logica sulle date che funziona sia per le date che per i valori di data/ora.
  • La logica per le date può utilizzare un indice, che può essere importante per questo tipo di query.
  • Non consiglio di utilizzare LEFT JOIN S. Ciò moltiplicherà i dati che possono rendere costosa la query.