找出每个在SQL中的百分比

时间:2018-09-03 02:27:14

标签: mysql

我在这里有两个桌子,旅行和用户 enter image description here

enter image description here

我的问题是在Oct 1, 2013 at 10am PDTOct 22, 2013 at 5pm PDT之间,每个城市每天被取消禁令的客户取消请求的百分比是多少?

2 个答案:

答案 0 :(得分:0)

此查询应工作:

SELECT 
    A.usersid,
    A.email,
    ((SELECT 
            COUNT(B.id)
        FROM
            trips B
        WHERE
            B.client_id = A.usersid
                AND request_at BETWEEN '10/1/2013' AND '10/22/2013'
                AND status <> 0) / (SELECT 
            COUNT(C.id)
        FROM
            trips C
        WHERE
            C.client_id = A.usersid
                AND request_at BETWEEN '10-1-2013' AND '10-22-2013') * 100) AS 'PERCENT'
FROM
    users A
WHERE
    A.role = 0 AND banned = FALSE

答案 1 :(得分:0)

SELECT
 t.city_id,
 DATE(t.request_at) AS day,
 (100*SUM(IF(t.status = 0, 0, 1))/COUNT(t.id)) AS cancellation_percentage
FROM trips t INNER JOIN users u ON t.client_id = u.users_id
WHERE u.banned = FALSE
  AND t.request_at BETWEEN '2013-10-01 17:00:00' AND '2013-10-23'
GROUP BY t.city_id, DATE(t.request_at)

应该产生输出,显示每个城市的city_id和百分比。这假设没有用户被删除,或者您不想包括已删除用户的旅行。它假定分子和分母都应排除被禁止的用户。

GROUP BY t.city_id, DATE(t.request_at)告诉您您想要合计的数字,按城市ID和请求的日期进行合计。我们输出t.city_id,所以我们知道哪个城市(或至少它的ID)。在from子句中加入users表之后,我们用where子句排除被禁止的用户。

在where子句中,我们还将PDT限制为2013年1月1日上午10点至2013年10月22日下午5点之间。由于这两个时间均在2013年美国的夏令时之内,因此与UTC的时差为7个小时。相加后一个日期将移至23日(默认为午夜或00:00:00)。前者仅移至UTC时间下午5点或17:00:00

COUNT(t.id)仅计算在所述日期时间之间不受禁止的客户请求的所有行程。 IF(t.status = 0, 0, 1)检查行程是否完成。如果是这样,则表示该行程取消了0次行程。如果不是,则将1次旅行计为该旅行的取消。然后,我们将所有这些相加,得到已取消行程的计数。我们将取消的计数除以总计数,然后将结果乘以100得到百分比。

您可能需要做

set time_zone = `PST8PDT`

或类似名称,而不是更改日期。

  AND t.request_at BETWEEN '2013-10-01 10:00:00' AND '2013-10-22 17:00:00'

这些是PDT中要求的日期/时间。

您可能应该再进行一次联接以获取城市名称而不是ID,但是这里没有足够的架构信息。