id client_id driver_id city_id status request_at
1 1 10 1 completed 2023-12-23
2 2 11 1 cancelled_by_driver 2023-12-23
3 3 12 6 completed 2023-12-23
4 4 13 6 cancelled_by_client 2023-12-23
5 1 10 1 completed 2023-12-24
6 2 11 6 completed 2023-12-24
7 3 12 6 completed 2023-12-24
8 2 12 12 completed 2023-12-25
9 3 10 12 completed 2023-12-25
10 4 13 12 cancelled_by_driver 2023-12-25
11 4 13 12 completed 2023-12-26
11 4 13 12 cancelled_by_driver 2023-12-27
我上面有一个表格。然后我写了如下代码:
SELECT count(*) as count_total,
count(*) filter (where status like 'completed%') as count_completed,
count(*) filter (where status like 'cancelled%') as count_cancelled,
request_at as Date
FROM rides
GROUP BY Date
我拿到了下表
count_totalcount_completedcount_cancelledDate
4 2 2 2023-12-23
1 1 0 2023-12-26
3 3 0 2023-12-24
1 0 0 2023-12-27
3 2 1 2023-12-25
然后我写了下面的代码
with counted_status as (SELECT count(*) as count_total,
count(*) filter (where status like 'completed%') as count_completed,
count(*) filter (where status like 'cancelled%') as count_cancelled,
request_at as Date
FROM rides
GROUP BY Date)
select Date, round(count_cancelled/count_total*100,2) as Cancellation_rate
from counted_status
where Date >= '2023-12-23' and Date <= '2023-12-25'
不知何故,我得到了这样的结果:
DateCancellation_rate
2023-12-23 0.00
2023-12-24 0.00
2023-12-25 0.00
谁能告诉我为什么?
我认为您正在尝试打印正确的 Cancellation_rate。但是您必须将变量的类型更改为浮动才能使其工作。
select Date, round(((count_cancelled * 1.0)/count_total)*100, 2) as Cancellation_rate
from counted_status where Date >= '2023-12-23' and Date <= '2023-12-25'
用此替换最后一条语句。
with counted_status as (SELECT count(*) as count_total,
count(*) filter (where status like 'completed%') as count_completed,
count(*) filter (where status like 'cancelled%') as count_cancelled,
request_at as Date
FROM rides
JOIN users
on users.user_id = rides.client_id
where users.banned = 'No'
GROUP BY Date)
select Date, round((count_cancelled::NUMERIC /count_total::NUMERIC)*100, 2) as Cancellation_rate
from counted_status where Date >= '2023-12-23' and Date <= '2023-12-25'
感谢 Frank Heikens 和 Ajex 提醒更改变量类型。我添加 ::numeric 并且它有效。