对除法的商进行四舍五入?

Pad*_*mez 2 sql postgresql rounding

我试图在 select 语句中划分两列,然后将商四舍五入到小数点后 4 位。

select round(round(sum(case when acct_no = '2999' 
      and date between '1/1/14' and current_date then amount end)::numeric, 4)::float
 / round(sum(case when acct_no = '3989' 
      and date between '1/1/14' and current_date then amount end)::numeric, 4)::numeric, 4) column
from table
Run Code Online (Sandbox Code Playgroud)

查询的其余部分将保存多个日期,因此其中的日期应该是必要的。

它给出的错误:

错误:函数 round(双精度,整数)不存在

这是在 PostgreSQL 中尝试过的。

Erw*_*ter 6

SELECT round((
          sum(CASE WHEN acct_no = '2999' 
              AND thedate between '2014-1-1' AND current_date THEN amount END)
        / sum(CASE WHEN acct_no = '3989' 
              AND thedate between '2014-1-1' AND current_date THEN amount END)
       )::numeric, 4) AS result
FROM   tbl;
Run Code Online (Sandbox Code Playgroud)
  • Postgres 中没有为浮点类型round()添加精度修饰符的函数。根据文档numeric,仅适用于。

  • 浮点数除以( )numeric的结果。测试:double precisionfloat8

      SELECT 5::float/3::numeric  -- result is double precision
    
    Run Code Online (Sandbox Code Playgroud)
  • 计算结束时舍入一次。这样更快、更准确。

  • 切勿用作date列名称。它是标准 SQL 中的保留字,也是 Postgres 中的基本类型。

  • 最好在代码中的日期文字中使用推荐的 ISO 8601 日期格式。无论设置和区域设置如何,这都有效,而您的本地格式会因不同的设置而中断。

如果不是rest of the query你提到的,这可以进一步简化:

  SELECT 5::float/3::numeric  -- result is double precision
Run Code Online (Sandbox Code Playgroud)

NULLIF()最后,这还捕获了除数上使用的“除以 0”异常。