PostgreSQL :没有 WHERE 的百分比

PostgreSQL : Percentage without a WHERE

提问人:user7370387 提问时间:1/18/2017 最后编辑:Mattuser7370387 更新时间:1/18/2017 访问量:67

问:

我需要获得一个百分比,但不能使用 WHERE 子句,因为它是大型 SQL 查询的一部分。

我试着这样做:

select (count(sector='Rurality'))/(count(sector))*100 as test from study

但是第一个计数会获得完整的结果,而不是筛选。

换句话说,这是行不通的:

select COUNT(sector='Rurality') AS test FROM study;

也许有人会有什么想法?问题是,在所有这些之后,过滤器都粘在 SQL 查询上,但无法添加 WHERE sector=“rurality”。

SQL PostgreSQL

评论

0赞 Lamak 1/18/2017
是,使用表达式CASE

答:

0赞 Matt 1/18/2017 #1

在 .CASECOUNT

SELECT (COUNT(CASE WHEN sector = 'Rurality' THEN 1 END)) / (COUNT(sector)) * 100 AS test 
FROM study

评论

0赞 user7370387 1/18/2017
非常感谢!我现在正在尝试
0赞 Matt 1/18/2017
@Lamak 我假设您之所以这么说是因为缺少或其他可分组的字段,但他们已经表示这是更大查询的一部分。GROUP BY
0赞 Lamak 1/18/2017
@Matt不,这是因为会计算值 1 和 0COUNT
0赞 Stephen 1/18/2017
COUNT(CASE WHEN sector = 'Rurality' THEN 1 END)应该工作正常
0赞 user7370387 1/18/2017
它的工作原理是这样的:SELECT (SUM(CASE WHEN sector = 'Rurality' THEN 1 ELSE 0 END)) 作为测试。总和是正确的 FROM study但是一旦我尝试除以 /(count(secteur)) * 100,它就不再起作用了。所以它部分工作,但不知道如何获得百分比,但它已经非常好了!是的,斯蒂芬,它正在工作,但不接受分歧.
1赞 pozs 1/18/2017 #2

这就是 FILTER 的用途:

select count(*) filter (where sector = 'Rurality') test from study;

对于较旧的 PostgreSQL,您可以使用 CASE 构造,但不要忘记省略子句以不计算值:ELSENULL

select count(case sector when 'Rurality' then 1 end) test from study;

此外,/ 将是 ,因此请使用强制转换和/或括号,或者只是重新构建您的公式,例如:bigintbigintbigint

select 100.0 * count(*) filter (where sector = 'Rurality') / count(sector) test
from   study;
0赞 klin 1/18/2017 #3

您的方法适用于:sum()

select sum((sector='Rurality')::int)::dec / count(sector)*100 as test from study