整数除法的结果为0

30

我感觉自己错过了一些显而易见的东西。我正在尝试测试random()分布。以下是表格:

create table test (
  id int,
  random_float float,
  random_int int
);

我想做的事情是:

truncate table test;
insert into test (id)
values (generate_series(1,1000));
update test 
set
  random_float = random() * 10 + 1;
update test
set
  random_int = trunc(random_float);
select 
  random_int,
  count(random_int) as Count,
  cast( count(random_int) / max(id) as float) as Percent
from test
group by random_int
order by random_int;

然而,“百分比”列对于每一条记录都返回零。我试过将其转换为浮点数,作为十进制数,我尝试将random_int列更改为十进制数而不是整数,结果总是相同的。

这里有一个演示。

请问我做错了什么?


5
在进行除法运算之前,将数据类型转换为“numeric”(或“float”,尽管我更喜欢前者)。 - vyegorov
你可以在一行代码中重现这个问题:select 1/2。返回值为0。 - usr
@Phrancis,在你进行除法运算之前,应该先进行类型转换:select 1/2, 1.0/2, 1.0*1/2, 1::numeric/2, cast(1 as float)/2; - vyegorov
2个回答

31

在进行除法计算之前,应该先进行转换类型操作。同时,您还需要使用一个子查询来获取表中的总记录数。这里是样例

select 
  random_int,
  count(random_int) as Count,
  cast(count(random_int) as decimal(7,2)) / cast((select count(random_int) from test) as decimal(7,2)) as Percent
from test
group by random_int
order by random_int;

1
我知道这一定与转换有关,所以感谢6年后仍然有用的答案!在我的情况下,我将整个calc强制转换为decimal(10,2),结果为0,但是单独转换每个组件效果很棒。仍在学习中! - Hilary
1
只需要将其中一个数字(例如分子)转换为十进制,整个表达式就变成了十进制。 - Milan

4

尝试使用以下查询语句:

select 
       random_int,
       count(random_int) as Count,
       cast( count(random_int) / max(id) as float) as Percent,
       (100.0 * count(random_int) / max(id))::numeric(5,2) as pct
  from test
 group by random_int
 order by random_int;

PostgreSQL拥有强大的类型系统。在您的情况下,类型由count()函数隐含地表示为返回bigint(或int8)和id列为integer
我建议最初使用100.0作为乘数,这将使整个表达式被计算为数字,并提供真正的百分比。您可能还需要在最后转换为numeric(5,2),以摆脱太大的数值。

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