Select 其中选择的 2 列来自 table 的 1 列,但条件不同

Select where 2 columns selected are from 1 column of table but with different conditions

我正在绕圈子查询,非常感谢您的帮助,因为我是这方面的新手。我正在使用 postgre sql,版本:9.5.8

我想做什么:

我想计算出部分销售额占全部销售额的百分比。

我完全搞砸的部分是最后的 select,我在 select 中两次从 table 中计算同一列 COUNT(sale_id) "sale",但通过 2 个不同的条件(一个有 'WHERE',一个没有)传递 COUNT(sale_id) 以创建 2 个新列。我是否需要将它们作为单独的 table 加入?

期望的结果应该是一个百分比。

这就是我所拥有的(但我当然遇到了一堆错误):

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");

如果您能用通俗易懂的方式表达解决方案,那将很有帮助。随意进行更改。

非常感谢您的帮助。

使用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;

您可以简单地计算 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)