【问题标题】:Calculating rates in PostgreSQL在 PostgreSQL 中计算费率
【发布时间】:2018-04-25 21:45:52
【问题描述】:

尝试做一些非常简单的事情并通过邮件计算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

【问题讨论】:

    标签: sql postgresql integer-division


    【解决方案1】:

    改用这个表达式:

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

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

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

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

    在除法之前乘以100 只有在将rate 增加到1 或更多时才会“有帮助”。 (它仍然是整数除法。)乘以 100.0 可以解决问题,因为带有小数位的数字常量被假定为 numeric 类型,而仅由数字组成的数字常量(和足够小)被假定为类型integer

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      如果你想要浮点数学先求和。

      【讨论】:

      • 当我先乘以 100 然后除以 count(*) 时仍然为 0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      相关资源
      最近更新 更多