Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menghitung persen?

Jika Anda ingin rasio pengguna yang telah melakukan pembayaran dengan mereka yang memiliki aktivitas, cukup rangkum setiap tabel satu per satu:

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:

Anda memerlukan tabel dengan semua tanggal dalam rentang. Itu adalah masalah terbesar.

Maka saya akan merekomendasikan:

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;

Catatan:

  • Ini mengembalikan NULL pada hari-hari di mana tidak ada aktivitas. Itu lebih masuk akal bagi saya daripada 0 .
  • Ini menggunakan logika pada tanggal yang berfungsi untuk nilai tanggal dan tanggal/waktu.
  • Logika untuk tanggal dapat menggunakan indeks, yang mungkin penting untuk jenis kueri ini.
  • Saya tidak menyarankan menggunakan LEFT JOIN s. Itu akan melipatgandakan data yang dapat membuat kueri menjadi mahal.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Peringatan:mysql_result() [function.mysql-result]:Tidak dapat melompat ke baris 0 pada indeks hasil MySQL 5 di profile.php pada baris 11

  2. Kapan saya harus menggunakan protokol terkompresi MySQL?

  3. phpMyAdmin melempar #2002 tidak dapat masuk ke server mysql phpmyadmin

  4. Mengapa mysql melewatkan beberapa id kenaikan otomatis?

  5. Bagaimana cara membunuh semua proses di daftar proses acara Mysql?