提问人:user7370387 提问时间:1/18/2017 最后编辑:Mattuser7370387 更新时间:1/18/2017 访问量:67
PostgreSQL :没有 WHERE 的百分比
PostgreSQL : Percentage without a WHERE
问:
我需要获得一个百分比,但不能使用 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”。
答:
0赞
Matt
1/18/2017
#1
在 .CASE
COUNT
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
构造,但不要忘记省略子句以不计算值:ELSE
NULL
select count(case sector when 'Rurality' then 1 end) test from study;
此外,/ 将是 ,因此请使用强制转换和/或括号,或者只是重新构建您的公式,例如:bigint
bigint
bigint
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
上一个:将 PHP 代码粘合到多个函数中
评论
CASE