Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để tính toán phần trăm?

Nếu bạn muốn tỷ lệ người dùng đã thanh toán cho những người có hoạt động, chỉ cần tóm tắt từng bảng riêng lẻ:

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;

CHỈNH SỬA:

Bạn cần một bảng với tất cả các ngày trong phạm vi. Đó là vấn đề lớn nhất.

Sau đó, tôi muốn giới thiệu:

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;

Ghi chú:

  • Điều này trả về NULL vào những ngày không có hoạt động. Điều đó có ý nghĩa với tôi hơn 0 .
  • Điều này sử dụng logic về ngày tháng hoạt động cho cả ngày tháng và giá trị ngày / giờ.
  • Logic cho ngày tháng có thể sử dụng một chỉ mục, chỉ mục này có thể quan trọng đối với loại truy vấn này.
  • Tôi không khuyên bạn nên sử dụng LEFT JOIN S. Điều đó sẽ nhân dữ liệu và có thể khiến truy vấn trở nên đắt đỏ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi WAMP / MySQL không đúng ngôn ngữ

  2. Khái niệm cơ bản về hệ thống ghi nhớ tôi

  3. FindByUUID () sử dụng Kho lưu trữ JPA của Spring Data

  4. Di chuyển cơ sở dữ liệu trên sản xuất django

  5. Cách tự động hóa quá trình di chuyển (lược đồ và dữ liệu) cho ứng dụng PHP / MySQL