Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak obliczyć procent?

Jeśli chcesz, aby stosunek użytkowników, którzy dokonali płatności, do tych wykazujących aktywność, po prostu podsumuj każdą tabelę indywidualnie:

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;

EDYCJA:

Potrzebujesz tabeli ze wszystkimi datami z zakresu. To jest największy problem.

W takim razie polecam:

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;

Uwagi:

  • To zwraca NULL w dni, w których nie ma aktywności. To ma dla mnie więcej sensu niż 0 .
  • To wykorzystuje logikę w datach, która działa zarówno dla dat, jak i wartości daty/czasu.
  • Logika dat może wykorzystywać indeks, co może być ważne w przypadku tego typu zapytań.
  • Nie polecam używania LEFT JOIN s. To pomnoży dane, które mogą sprawić, że zapytanie będzie drogie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dlaczego otrzymuję błąd składni dla przygotowanego zestawienia?

  2. Obliczanie całkowitej ilości sprzętu dla zakresu dat

  3. Co oznaczają ikony kolumn mysql workbench

  4. Hasło nie jest weryfikowane za pomocą funkcji password_verify

  5. Elementy sum MySql w kolumnie