尝试做一些非常简单的事情并通过邮件计算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
答案 0 :(得分:1)
请改用此表达式:
SUM(signup_flow) * 100.0 / COUNT(signup_flow) AS rate
与@Richard suggested一样,您的问题是整数除法,其中小数位被截断。手册:
/
...除法(整数除法截断结果)
当你得到的只是小数位时,这会破坏乐趣。
仅在分割前乘以100
"帮助"如果它将rate
调到1或更多。 (它仍然是整数除法。)乘以 100.0
可以解决问题,因为假设一个带小数位的数字常量是numeric
类型,而a仅由数字组成的数字常量(并且足够小)被假定为类型integer
。
或者,明确地将至少一个涉及的数字强制转换为float
或numeric
,这会在整个计算中强制使用非整数类型。
您可能希望将round()
结果移到给定数量的小数位(适用于numeric
):
round(SUM(signup_flow) * 100.0 / COUNT(signup_flow), 2) AS rate
相关(更多解释和链接):
答案 1 :(得分:0)
这些值将是整数,因此计算将使用整数运算。这意味着除法通常会导致零,然后乘以100。
如果您对整数百分比感到满意,请先乘以100而不是最后一个。
如果你想要浮点数学,那就先投这个数。