答案 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,但是这里没有足够的架构信息。