我会在查询中圈出来并感谢您的帮助,因为我对此非常陌生。我正在使用postgre sql,版本:9.5.8
我正在尝试做什么:
我想计算出部分销售额占全部销售额的百分比。
我完全弄乱的部分是最终选择,我从表“sale”中选择相同的列COUNT(sale_id)两次,但是将COUNT(sale_id)传递到2个不同的条件(一个带'' WHERE'和一个没有)创建2个新列。我是否需要将这些作为单独的表加入?
期望的结果应该是百分比。
这就是我所拥有的(但我当然会收到一堆错误):
SELECT ROUND(percentage_partial_sale, 1) as "percentage_partial"
FROM (
SELECT count_partial_sale / count_all_sales as percentage_partial_sale
FROM (
SELECT COUNT(sale_id) FROM sale WHERE sale.is_partial=true as "count_partial_sale",
COUNT(sale_id) FROM sale as "total_sellouts");
如果你能以外行的方式表达解决方案,那会很有帮助。随意根据需要进行更改。
非常感谢你的帮助。
答案 0 :(得分:1)
使用CASE WHEN
有条件地计算:
select
count(*) as all_sales,
count(case when is_partial then 1 end) as partial_sales,
count(case when is_partial then 1 end)::decimal / count(*)::decimal * 100.0 as ratio
from sale;
答案 1 :(得分:0)
您可以简单地计算is_partial
投放到integer
的平均值(false为0,true为1):
[local] #= CREATE TABLE sale (is_partial boolean);
CREATE TABLE
[local] #= INSERT INTO sale VALUES (false), (false), (true);
INSERT 0 3
[local] #= SELECT AVG(is_partial::int) FROM sale;
┌────────────────────────┐
│ avg │
├────────────────────────┤
│ 0.33333333333333333333 │
└────────────────────────┘
(1 row)
Time: 6,012 ms
如果使用AVG
无法完成您的使用案例,则可以使用FILTER
从聚合函数中删除行:
[local] #= SELECT COUNT(*) FILTER (WHERE is_partial) / COUNT(*) :: float
FROM sale;
┌───────────────────┐
│ ?column? │
├───────────────────┤
│ 0.333333333333333 │
└───────────────────┘
(1 row)