SQL查询问题:将薪资统计结果转为FLOAT并保留两位小数
解决PostgreSQL中薪资统计需保留两位小数且为FLOAT类型的问题
我来帮你搞定这个问题!你纠结的点在于既要将平均薪资、总薪资转为FLOAT类型,又要保留两位小数,其实用PostgreSQL的ROUND函数就能完美实现两者兼顾,先给你正确的SQL语句:
SELECT j.job_title, ROUND(AVG(j.salary)::FLOAT, 2) AS average_salary, COUNT(p.id) AS total_people, ROUND(SUM(j.salary)::FLOAT, 2) AS total_salary FROM people p JOIN job j ON p.id = j.people_id GROUP BY j.job_title ORDER BY average_salary DESC;
关键细节说明:
- 类型转换+保留小数:先用
::FLOAT(或者CAST(xxx AS FLOAT))将薪资的统计值转为FLOAT类型,再用ROUND(..., 2)对结果四舍五入保留两位小数。这里要注意:PostgreSQL中ROUND函数如果输入是FLOAT类型,返回的结果依然是FLOAT类型,正好满足你的需求。 - 无需DISTINCT:因为已经用
GROUP BY j.job_title分组,每个职位只会返回一条结果,所以DISTINCT(j.job_title)是多余的,可以去掉。 - 排序修正:你要求按平均薪资从高到低排序,所以用
ORDER BY average_salary DESC,之前的尝试里按total_salary排序不符合需求哦。
你的三次尝试问题分析:
- 尝试1:用
to_char函数把数值转成了格式化后的字符串(比如'5000.00'),结果类型是VARCHAR而非FLOAT,这就是为什么你说结果不是FLOAT类型。 - 尝试2:只做了类型转换但没使用
ROUND函数,所以统计值保留了原始精度,没有两位小数的格式。 - 尝试3:这是个语法错误!你写的
ROUND (AVG(CAST(j.salary as FLOAT)), 2))多了一个右括号,修正为ROUND(AVG(CAST(j.salary AS FLOAT)), 2)后,这个语句其实是可以正常工作的,返回的就是保留两位小数的FLOAT类型值。
内容的提问来源于stack exchange,提问作者Maggie Liu




