在PostgreSql中计算百分比

20

比如我有这样一张表:

string adm
A       2
A       1
B       2
A       1
C       1
A       2

我希望通过一条SQL查询获得像这样的结果:

string    perc_adm (%)
A            50
B            100
C            0

我想要在每个字符串中计算数字2的出现百分比。我已经可以在不同条件下获取这个结果,但我需要将它们合并成一个条件。 另外,我遇到了一些除以零的错误,请问该如何在条件语句中进行修正?


你意识到你的例子中百分比总和为150%了吗?根据你的情况,如果应该是A占66.66%,B占33.33%。 - Rahul
请在问题中添加您的实际代码。 - Tom-db
抱歉,但我的代码是正确的。我想要每个字符串中数字2出现的百分比。有4个字符串A,其中两个有数字2,因此百分比为50%。有一个值为2的字符串B,因此出现率为100%。 - Bárbara Duarte
啊,现在问题更清楚了。那么将这个例子从评论中移到问题中。 - Tom-db
2个回答

35

试试:

select 
    string,
    (cnt_2/total::float)*100 perc_adm
from (
    select 
        string, 
        count(*) total, 
        sum(case when adm = 2 then 1 else 0 end) cnt_2
    from tbl
    group by string
) x
order by string

在这里,total::float将除法转换为float值,否则int/int ==>int

SQL Fiddle演示


7
考虑使用nullif保护你的除法(以防 count(*) 返回零行): cnt_2 / nullif(total, 0)::float - mcadorel

3

尝试:

select 
    string,
    100.0*sum(case when adm = 2 then 1 else 0 end)/count(*) as perc_adm
from tbl
group by string
order by string

这种方式避免了子查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接