我有一个包含可以有5种不同状态(11,12,14,22,24)的订单的表。我想计算一下状态的数量' 12' (失败的订单)发生并将其除以状态计数总数(订单总数)。
这是我桌子的样子:
status_id | restaurant
----------------------
11 | rest1
11 | rest1
12 | rest2
12 | rest3
12 | rest1
14 | rest1
24 | rest1
22 | rest1
我想要以下(百分比作为例子)
status_id | restaurant | perc_of_status_id_12
---------------------------------------------
11 | rest1 | 10%
11 | rest1 | 10%
12 | rest2 | 5%
12 | rest3 | 11%
12 | rest1 | 10%
14 | rest1 | 10%
24 | rest1 | 10%
22 | rest1 | 10%
所以最后一列的计算应该是:
Count of status id 12 for restaurantX / total number of orders
如果它与restaurantX的订单总数成比例,那将更加完美。例如,接收1个订单而失败1的餐馆的失败率为100%,但是接收100个订单而失败的5个餐馆的失败率为5%。但是,应优先考虑5个订单失败的餐厅。我现在还不知道如何合并,也许根据订单总数分配权重。如果有人对它有所了解,那将非常感激。
通过加权,表格看起来像这样:
status_id | restaurant | perc_of_status_id_12 | weighted
--------------------------------------------------------
11 | rest1 | 10% | 10% * weight
11 | rest1 | 10% |
12 | rest2 | 5% |
12 | rest3 | 11% |
12 | rest1 | 10% |
14 | rest1 | 10% |
24 | rest1 | 10% |
22 | rest1 | 10% |
我尝试用COUNT玩一下,但我无法弄明白。我试过这个:
ROUND((COUNT(CASE WHEN o.status_id = '12' THEN 1 END) * 100)::numeric / COUNT(CASE WHEN o.status_id IN ('11','12','14','22','24') THEN 1 END, 2)) AS fail_perc
答案 0 :(得分:0)
对聚合使用FILTER
子句:
COUNT(status_id) FILTER (WHERE status_id = 12) / CAST(COUNT(status_id) AS float4)
对于较旧的PostgreSQL版本,您可以改为使用CASE
:
COUNT(CASE WHEN status_id = 12 THEN 1 END) / CAST(COUNT(status_id) AS float4)