计算PostgreSQL中的速率

时间:2018-04-25 21:45:52

标签: sql postgresql integer-division

尝试做一些非常简单的事情并通过邮件计算signup_flow率。

我有一个名为signup_flow的列 - 每行的整数值为1或0.尝试计算每封邮件的signup_flow的速率。

我正在使用以下查询。 SUM(signup_flow)COUNT(signup_flow)会为每封邮件返回正确的值。当我尝试做一个简单的计算字段(sum/count*100)时,它返回0.这是我第一次使用Postgres,是否不支持计算?

  SELECT mailing, SUM(signup_flow), COUNT(signup_flow),   
         ((SUM(signup_flow)/COUNT(signup_flow))*100) AS rate
    FROM mail_2017_analytic_file
GROUP BY mailing;

结果:

mailing             sum      count   rate
DEC 17 RRD Mailing  2535    1085476  0
JAN 17 RRD Mailing  8275    3695017  0
MAR 17 RRD Mailing  7230    3595594  0
MAY 17 RRD Mailing  5616    2672981  0
JULY 17 RRD Mailing 7837    3741944  0
AUG 17 RRD Mailing  9272    4604807  0
OCT 17 RRD Mailing  7982    4996146  0

2 个答案:

答案 0 :(得分:1)

请改用此表达式:

    SUM(signup_flow) * 100.0 / COUNT(signup_flow) AS rate

@Richard suggested一样,您的问题是整数除法,其中小数位被截断。手册:

  

/ ...除法(整数除法截断结果)

当你得到的只是小数位时,这会破坏乐趣。

仅在分割前乘以100"帮助"如果它将rate调到1或更多。 (它仍然是整数除法。)乘以 100.0 可以解决问题,因为假设一个带小数位的数字常量是numeric类型,而a仅由数字组成的数字常量(并且足够小)被假定为类型integer

或者,明确地将至少一个涉及的数字强制转换为floatnumeric,这会在整个计算中强制使用非整数类型。

您可能希望将round()结果移到给定数量的小数位(适用于numeric):

    round(SUM(signup_flow) * 100.0 / COUNT(signup_flow), 2) AS rate

相关(更多解释和链接):

答案 1 :(得分:0)

这些值将是整数,因此计算将使用整数运算。这意味着除法通常会导致零,然后乘以100。

如果您对整数百分比感到满意,请先乘以100而不是最后一个。

如果你想要浮点数学,那就先投这个数。