在特定条件下计算组内的百分比
Posted
技术标签:
【中文标题】在特定条件下计算组内的百分比【英文标题】:Calculating percentages within a group, given a certain condition 【发布时间】:2021-08-06 16:30:42 【问题描述】:我有一张包含以下信息的客户订单表:
transaction_id | order_id | merchant_id | merchant_name | on_sale |
---|---|---|---|---|
423hk42b | tuy24u24g | 20022 | This LTD | Yes |
h64v64h6 | tuy24u24g | 20022 | This LTD | Yes |
h3v45gh3 | 4i32ghi2i | 22012 | That SAS | No |
b3k45b44 | 2b34u3bbu | 12032 | Stuff LTD | No |
jb435bj4 | 1j3bh1hj3 | 12032 | Stuff LTD | Yes |
jb3k53kb | 12hb3jbb1 | 13121 | More Stuff LTD | Yes |
我需要一个查询来查找每个商家的销售订单百分比。输出应如下所示:
merchant_id | merchant_name | total_orders | total_orders_on_sale | perc_sales_orders |
---|---|---|---|---|
20022 | This LTD | 1381 | 132 | 9.55 |
22012 | That SAS | 1313 | 87 | 6.62 |
12032 | Stuff LTD | 1323 | 34 | 2.56 |
对此有什么帮助吗?我尝试了窗口函数或 WITH 语句,但最终得到了错误的数字。
【问题讨论】:
【参考方案1】:我想你想要聚合:
select merchant_id, merchant_name,
count(*) as num_orders,
sum(case when on_sale = 'Yes' then 1 else 0 end) as num_on_sale,
avg(case when on_sale = 'Yes' then 1.0 else 0 end) as ratio_on_sale
from t
group by merchant_id, merchant_name;
编辑:
修改版可以使用count(distinct)
:
select merchant_id, merchant_name,
count(distinct order_id) as num_orders,
count(distinct case when on_sale = 'Yes' then order_id end) as num_on_sale,
( count(distinct case when on_sale = 'Yes' then order_id end) * 100.0 /
count(distinct order_id)
) as ratio_on_sale
from t
group by merchant_id, merchant_name;
【讨论】:
我忘记包含原始表中的 transaction_id。我需要计算不同的订单 ID,因为它们是唯一标识符。因此,SUM 语句将不起作用,因为它会包含重复项。我无法删除重复项,因为我需要其他信息。对这里的混乱表示歉意。以上是关于在特定条件下计算组内的百分比的主要内容,如果未能解决你的问题,请参考以下文章