除法产生意想不到的结果

问题描述 投票:0回答:2
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

谁能告诉我为什么?

sql postgresql integer-division
2个回答
2
投票

我认为您正在尝试打印正确的 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'

用此替换最后一条语句。


0
投票
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 并且它有效。

© www.soinside.com 2019 - 2024. All rights reserved.