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)
我正在绕圈子查询,非常感谢您的帮助,因为我是这方面的新手。我正在使用 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)