Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да изчислим процента?

Ако искате съотношението на потребителите, които са направили плащания към тези с активност, просто обобщете всяка таблица поотделно:

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;

РЕДАКТИРАНЕ:

Нуждаете се от таблица с всички дати в диапазона. Това е най-големият проблем.

Тогава бих препоръчал:

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;

Бележки:

  • Това връща NULL в дните, в които няма активност. Това за мен има повече смисъл от 0 .
  • Това използва логика за датите, която работи както за дати, така и за стойности за дата/час.
  • Логиката за дати може да използва индекс, който може да бъде важен за този тип заявка.
  • Не препоръчвам да използвате LEFT JOIN с. Това ще умножи данните, което може да направи заявката скъпа.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как се свързвате с множество MySQL бази данни на една уеб страница?

  2. MySql пълнотекстово търсене в PHP с помощта на низ, съдържащ ключови думи

  3. Каква е разликата между използването на INDEX срещу KEY в MySQL?

  4. Подготвеният от MySql конектор оператор прехвърля само 64 байта

  5. как да извлека данни от две таблици в mysql?