表格:
people(id, name)
job (id, people_id, job_title, salary)
目标:显示每个唯一的工作,平均总工资(浮动并四舍五入到小数点后两位) 人员和总工资(浮动并四舍五入到小数点后两位),并按最高平均工资排序。
因此,挑战在于将转换类型保持为浮点型,同时将其四舍五入到小数点后两位。
我已经到了将它四舍五入到小数点后两位的位置,但是它不是浮点数。我已经将它放到浮动的位置,但是无法将其四舍五入到小数点后两位。
我的尝试:
尝试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
问题:未四舍五入到小数点后两位
尝试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。
答案 0 :(得分:0)
答案取决于列salary
的实际数据类型。关键是Postgres中的round()
不允许float
(仅支持numeric
类型)。
如果要处理numeric
数据类型,则可以首先round()
,然后强制转换为float
:
round(avg(salary), 2)::float
如果要处理float
列,则需要在其上使用round()
之前强制转换聚合函数的结果:
round(avg(salary)::numeric, 2)::float
答案 1 :(得分:0)
因此,挑战在于将转换类型保持为浮点型,同时将其四舍五入到小数点后两位。
如果您严格希望避免抛弃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"
乘以* float '100'
即可实现转换和乘法-因为avg()
产生的数据类型取决于输入quoting the manual:
numeric
用于任何整数类型的参数,double precision
用于浮点参数,否则与参数数据类型相同
关于Postgres中的转换:
distinct(j.job_title)
很可能没有按照您认为的做。没有功能distinct()
。 DISTINCT
是语法元素-在这里完全没有用,只会增加成本。请参阅此相关案例并进行解释:
关于NULLS LAST
: