选择从列的1列中选择2列的位置,但条件不同

时间:2017-09-01 19:12:34

标签: sql postgresql select postgresql-9.5

我会在查询中圈出来并感谢您的帮助,因为我对此非常陌生。我正在使用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");

如果你能以外行的方式表达解决方案,那会很有帮助。随意根据需要进行更改。

非常感谢你的帮助。

2 个答案:

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