Here is the database:
The first table is named Trip
and the second table is Users
.
CLIENT_ID
and DRIVER_ID
are foreign keys for USERS_ID
in the Users
table. I want to find how many orders cancelled by the non-banned driver and non-banned passenger for each day (Trip.Status != 'completed' and Users.Banned ='No'
).
My code is :
x
SELECT
t.Request_at AS 'Day',
COUNT(Status != 'completed') OVER (PARTITION BY t.Request_at) AS 'Cancellation Num'
FROM
Trips t
JOIN
Users u1 ON t.Client_Id = u1.Users_Id AND u1.Banned = 'No'
JOIN
Users u2 ON t.Driver_Id = u2.Users_Id AND u2.Banned = 'No'
WHERE
t.Request_at >= '2013-10-01' AND t.Request_at <= '2013-10-03'
GROUP BY
t.Request_at
The results for ‘2013-10-01’ and ‘2013-10-03’ are right(both equal to 1). But it turns wrong at ‘2013-10-02’. It becomes to 1, but it should be 0. I do not know where is the mistake in my code. Could someone help me?
Advertisement
Answer
I suspect that you really want conditional aggregation, not a window function:
SELECT t.Request_at AS Day,
SUM(CASE WHEN Status <> 'completed' THEN 1 ELSE 0 END) as num_cancellations
FROM Trips t JOIN
Users u1
ON t.Client_Id = u1.Users_Id AND
u1.Banned = 'No' JOIN
Users u2
ON t.Driver_Id = u2.Users_Id AND u2.Banned = 'No'
WHERE t.Request_at >= '2013-10-01' AND t.Request_at <= '2013-10-03'
GROUP BY t.Request_at;
Note: Only use single quotes for string and date constants. Don’t use them for column aliases.