Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment calculer le pourcentage ?

Si vous souhaitez connaître le rapport entre les utilisateurs qui ont effectué des paiements et ceux qui ont une activité, récapitulez simplement chaque tableau individuellement :

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;

MODIFIER :

Vous avez besoin d'un tableau avec toutes les dates de la plage. C'est le plus gros problème.

Alors je recommanderais :

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;

Remarques :

  • Ceci renvoie NULL les jours où il n'y a pas d'activité. Cela a plus de sens pour moi que 0 .
  • Cela utilise une logique sur les dates qui fonctionne à la fois pour les dates et les valeurs de date/heure.
  • La logique des dates peut utiliser un index, ce qui peut être important pour ce type de requête.
  • Je ne recommande pas d'utiliser LEFT JOIN s. Cela multipliera les données, ce qui peut rendre la requête coûteuse.