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

Hvordan beregner man procent?

Hvis du vil have forholdet mellem brugere, der har foretaget betalinger, og dem med aktivitet, skal du blot opsummere hver tabel individuelt:

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:

Du skal bruge en tabel med alle datoer i intervallet. Det er det største problem.

Så vil jeg anbefale:

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;

Bemærkninger:

  • Dette returnerer NULL på dage, hvor der ikke er aktivitet. Det giver mere mening for mig end 0 .
  • Dette bruger logik på datoerne, der fungerer for både datoer og dato/tidsværdier.
  • Logikken for datoer kan gøre brug af et indeks, hvilket kan være vigtigt for denne type forespørgsel.
  • Jeg anbefaler ikke at bruge LEFT JOIN s. Det vil mangedoble dataene, hvilket kan gøre forespørgslen dyr.


  1. opdater kolonneværdier med kolonne i en anden tabel baseret på betingelse

  2. Vis en enkelt kolonneværdi for mysqli-forespørgsel

  3. TRUNC(dato) Funktion i Oracle

  4. Få kolonneoplysninger til en tabel eller visning i SQL Server (T-SQL:sp_columns)