Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie berechnet man Prozent?

Wenn Sie das Verhältnis von Benutzern, die Zahlungen geleistet haben, zu Benutzern mit Aktivität anzeigen möchten, fassen Sie einfach jede Tabelle einzeln zusammen:

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;

BEARBEITEN:

Sie benötigen eine Tabelle mit allen Daten im Bereich. Das ist das größte Problem.

Dann würde ich empfehlen:

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;

Hinweise:

  • Dies gibt NULL zurück an Tagen, an denen keine Aktivitäten stattfinden. Das ergibt für mich mehr Sinn als 0 .
  • Dies verwendet Logik für Datumsangaben, die sowohl für Datumsangaben als auch für Datums-/Uhrzeitwerte funktionieren.
  • Die Logik für Datumsangaben kann einen Index verwenden, was für diese Art von Abfrage wichtig sein kann.
  • Ich empfehle die Verwendung von LEFT JOIN nicht s. Dadurch vervielfachen sich die Daten, was die Abfrage teuer machen kann.