postgres中float 2 dp的转换

dauxcl2d  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(362)

我试图将平均工资和总工资转换为浮动小数点后2位,但我不断得到一个错误。我做得对吗?
错误:测试失败预期2是一种浮点

SELECT 
  j.job_title,
  SUM(j.salary)/COUNT(p.id)::float, 2 AS average_salary,
  COUNT(p.id) AS total_people,
  SUM(j.salary):: float, 2 AS total_salary
  FROM job j
    JOIN people p
    ON p.id = j.people_id
  GROUP BY j.job_title
  ORDER BY total_salary DESC
  LIMIT 100
2vuwiymt

2vuwiymt1#

试试下面的,你不见了 round() 周围 average_salary 以及 total_salary 因为你只是 , 2 不使用 round() . 如果你转换 SUM(j.salary) 如果是浮动的话,它应该会给你预期的结果。

SELECT 
  j.job_title,
  round(SUM(j.salary)::float/COUNT(p.id), 2) AS average_salary,
  COUNT(p.id) AS total_people,
  round(SUM(j.salary)::float, 2) AS total_salary
FROM job j
    JOIN people p
    ON p.id = j.people_id
GROUP BY j.job_title
ORDER BY total_salary DESC
LIMIT 100
nzkunb0c

nzkunb0c2#

可以使用浮点,但不能将其设置为特定的小数位数。postgresql中可用的浮点类型有 real 或者 double precision .
您可以这样做:

expression::real

或者,使用 numeric(10,2) ,在哪里 10 是精度(总位数)和 2 是刻度(小数位数):

postgres=# SELECT (15::decimal/7)::decimal(10,2);
 numeric 
---------
    2.14
(1 row)

请注意,必须将表达式中的一个值强制转换为 decimal ,否则将两者都视为 int ,并且除法将产生一个整数,因此强制转换为 decimal 在那之后就不准确了。
例如:

postgres=# SELECT (15/7)::decimal(10,2);
 numeric 
---------
    2.00
(1 row)

这也适用于 real 类型,其中必须将表达式中的至少一个值强制转换为 real 为了得到准确的结果。
有关更多信息,请参阅文档:https://www.postgresql.org/docs/12/datatype-numeric.html

相关问题