You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动