计算与总计数相比的特定列值的出现次数

时间:2015-09-02 04:14:01

标签: sql postgresql

我有一个包含可以有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

1 个答案:

答案 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)