Trips and Users

Write a SQL query to find the cancellation rate of requests with unbanned users (both client and driver must not be banned) each day between "2013-10-01" and "2013-10-03".
The cancellation rate is computed by dividing the number of canceled (by client or driver) requests with unbanned users by the total number of requests with unbanned users on that day.

Example:

Table: Trips:
+----+-----------+-----------+---------+---------------------+------------+
| Id | Client_Id | Driver_Id | City_Id | Status              | Request_at |
+----+-----------+-----------+---------+---------------------+------------+
1  | 1         | 10        | 1       | completed           | 2013-10-01 |
2  | 2         | 11        | 1       | cancelled_by_driver | 2013-10-01 |
3  | 3         | 12        | 6       | completed           | 2013-10-01 |
4  | 4         | 13        | 6       | cancelled_by_client | 2013-10-01 |
5  | 1         | 10        | 1       | completed           | 2013-10-02 |
6  | 2         | 11        | 6       | completed           | 2013-10-02 |
7  | 3         | 12        | 6       | completed           | 2013-10-02 |
8  | 2         | 12        | 12      | completed           | 2013-10-03 |
9  | 3         | 10        | 12      | completed           | 2013-10-03 |
10 | 4         | 13        | 12      | cancelled_by_driver | 2013-10-03 |
+----+-----------+-----------+---------+---------------------+------------+

Table: Users
+----------+--------+--------+
| Users_Id | Banned | Role   |
+----------+--------+--------+
1        | No     | client |
2        | Yes    | client |
3        | No     | client |
4        | No     | client |
10       | No     | driver |
11       | No     | driver |
12       | No     | driver |
13       | No     | driver |
+----------+--------+--------+

Result:
+------------+-------------------+
Day        | Cancellation Rate |
+------------+-------------------+
2013-10-01 | 0.33              |
2013-10-02 | 0.00              |
2013-10-03 | 0.50              |
+------------+-------------------+

Approach

Mysql

SELECT t.Request_at Day
round(sum(case when t.Status = 'completed' then 0 else 1 end) / count(*), 2"Cancellation Rate"
FROM Trips t
INNER JOIN Users u 
ON t.Client_Id = u.Users_Id AND u.Banned = 'No'
WHERE t.Request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY t.Request_at

Oracle

SELECT t.Request_at Day
round(sum(case when t.Status = 'completed' then 0 else 1 end) / count(*), 2"Cancellation Rate"
FROM Trips t
JOIN Users u 
ON t.Client_Id = u.Users_Id AND u.Banned = 'No'
WHERE t.Request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY t.Request_at


No comments:

Post a Comment