【问题标题】:Changing data type to float and rounding to 2 decimal digits将数据类型更改为浮点数并舍入为 2 位小数
【发布时间】:2019-08-20 22:44:53
【问题描述】:

表格:

people(id, name)
job (id, people_id, job_title, salary) 

目标:显示每个独特的工作,总平均工资(FLOAT,四舍五入到小数点后2位),总 人员和总工资(浮点数,保留小数点后两位)并按最高平均工资排序。

因此,挑战是保持转换类型为浮点型,同时将其四舍五入到小数点后 2 位。

我已经将它四舍五入到小数点后 2 位,但它不是浮点数。我已经把它带到了它的浮动位置,但我不能把它四舍五入到小数点后 2 位。

我的尝试

尝试 1:

SELECT 
  distinct(j.job_title) as job_title,
  to_char(AVG(j.salary)::FLOAT, 'FM999999990.00') as average_salary,
  COUNT(p.id) as total_people,
  CAST (SUM(j.salary) AS FLOAT) as total_salary
  FROM people p
    JOIN job j on p.id = j.people_id
  GROUP BY j.job_title
  ORDER BY total_salary

问题:仍然说它不是浮动的

尝试 2:

SELECT 
  distinct(j.job_title) as job_title,
  CAST (AVG(j.salary) AS FLOAT) as average_salary,
  COUNT(p.id) as total_people,
  CAST (SUM(j.salary) AS FLOAT) as total_salary
  FROM people p
    JOIN job j on p.id = j.people_id
  GROUP BY j.job_title
  ORDER BY total_salary

问题:未四舍五入到小数点后 2 位

尝试3:

SELECT 
  distinct(j.job_title) as job_title,
  ROUND (AVG(CAST(j.salary as FLOAT)), 2)) as average_salary,
  COUNT(p.id),
  ROUND (SUM(CAST(j.salary as FLOAT)), 2)) as total_salary
  FROM people p
    JOIN job j on p.id = j.people_id
  GROUP BY j.job_title
  ORDER BY total_salary

我收到一条错误消息,提示我需要添加显式强制转换类型,这导致我尝试第 1 次。

【问题讨论】:

  • 怎么样:ROUND(AVG(j.salary), 2)::float
  • salary 列的数据类型是什么?是float,还是别的什么,比如numericinteger

标签: sql postgresql types casting average


【解决方案1】:

答案取决于列salary 的实际数据类型。关键是Postgres中的round()不允许floats(只支持numeric类型)。

如果您正在处理numeric 数据类型,那么您可以先round(),然后转换为float

round(avg(salary), 2)::float

如果您正在处理 float 列,那么您需要在使用 round() 之前转换聚合函数的结果:

round(avg(salary)::numeric, 2)::float

【讨论】:

  • 谢谢,它是一个数字数据类型! (回答您上面的评论)!
【解决方案2】:

因此,挑战是保持转换类型为浮点型,同时将其四舍五入到小数点后 2 位。

如果你绝对想避免抛弃float,你可以这样做:

test=# 
test=# SELECT float '12.3456'
test-#      , round(float '12.3456' * 100) / 100 AS rounded
 float8  | rounded
---------+----------
 12.3456 |    12.35

重点是:round() 将小数位数作为第二个参数是基于numeric(因为浮点数本质上是不精确的)。
但是round() 有一个重载变体,它采用一个四舍五入到最接近整数的参数。之前乘以 100,之后除以 100。

或者克服你对numeric 的厌恶并使用round(numeric, int) as provided by GMB

查询

SELECT j.job_title  -- !
     , round(AVG(j.salary) * float '100') / 100 AS average_salary  -- !
     , COUNT(p.id) AS total_people
     , SUM(j.salary)::float AS total_salary  -- short cast syntax
FROM   people p
JOIN   job    j ON p.id = j.people_id
GROUP  BY j.job_title
ORDER  BY total_salary DESC NULLS LAST -- ! "order by highest average salary" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多