我正在尝试查找满足特定条件的行的百分比。我的查询很接近,但是答案总是四舍五入到最接近的整数。
例如,以下查询返回6,但应返回6.25。意味着6.25%的行满足该条件。我该怎么办?
select sum(case when name like 'H%' then 1 else 0 end) * 100 / count(*)
from category
答案 0 :(得分:1)
只需添加一个小数点:
select sum(case when name like 'H%' then 1.0 else 0 end) * 100 / count(*)
from category;
Postgres进行整数除。
您也可以使用avg()
来表达这一点:
select avg(case when name like 'H%' then 100.0 else 0 end)
from category;
不需要小数点。尽管Postgres进行整数的整数除法,但它使用小数点计算整数的平均值。
这可以更简单地表示短语(假设name
不是NULL
):
select avg( (name like 'H%')::int ) * 100
from category;
答案 1 :(得分:0)
您需要一个十进制值,否则,由于分子和分母都是整数,因此Postgres会进行整数除。
但是在这里,我只使用avg()
-您不需要整数值:
select avg(case when name like 'H%' then 1 else 0 end) * 100
from category
答案 2 :(得分:0)
您正在执行integer division,因此省略了小数点后的所有内容。如果您使用浮点文字100.0
,则应该可以:
select sum(case when name like 'H%' then 1 else 0 end) * 100.0 / count(*)
from category