为什么使用 DBeaver 和 Postgres 的 SQL 代码中的“ROUND(variable)”不起作用?

Why is 'ROUND(variable)' not working in my SQL code using DBeaver and Postgres?

提问人:Sharon R. 提问时间:6/3/2023 最后编辑:Sharon R. 更新时间:6/4/2023 访问量:182

问:

我正在学习 SQL,并且正在 Windows 10 上使用 Postgres 15 开发 DBeaver。我正在尝试计算 Codecademy 给我的问题。在这里:

/该奖项颁发给拥有最小规模的团队 2010 年的“每次获胜成本”。每次获胜的成本由以下因素决定 团队的总工资除以 在给定的年份获胜。请注意,我们决定查看 只是 2010 年的团队,因为当我们找到这个奖项时 纵观所有年份,我们发现由于通货膨胀, 1900 年代的球队每场胜利花费的钱要少得多。我们 以为在2010年看所有球队 给出了一个更有趣的统计数据。/

这是我的代码:

WITH total_salary AS
(
        SELECT
        SUM(salaries.salary) AS "salary_sum",
        teams.name AS "team_name",
        salaries.yearid AS "year_id",
        teams.w AS "wins"
    FROM salaries
    JOIN teams
        ON salaries.team_id = teams.id
    WHERE salaries.yearid = 2010
    GROUP BY
        teams.name, teams.w, salaries.yearid
    ORDER BY
        teams.w DESC
),
cost_per_win_raw AS 
(
    SELECT 
        (salary_sum / wins) AS "cost_per_win_num"
    FROM total_salary
)
SELECT
    ROUND(cost_per_win_num, 2) AS "cost_per_win"
FROM cost_per_win_raw
GROUP BY cost_per_win
ORDER BY cost_per_win DESC;

我的问题是为什么 ( ROUND(cost_per_win_num), 2) AS “cost_per_win” 不起作用? 每次它都会向我抛出这个错误:

SQL Error [42883]: ERROR: function round(double precision, integer) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 448

注意:teams.w 是 smallint,salaries.salary 是双精度。

SQL PostgreSQL 语法错误 舍入 DBeaver

评论

0赞 Adrian Klaver 6/3/2023
每个数学函数圆形(v 数字,s 整数)→数。所以做: .虽然我不确定你是如何得到的,因为 Postgres 对整数进行了除法:和.您可能需要验证 和 的类型。CASTROUND(cost_per_win_num::numeric, 2)double precisionintegerselect 1/2; 0select pg_typeof(1/2); integersalary_sum / winssalarywins
0赞 Sharon R. 6/4/2023
好的,所以我对数据类型的看法是错误的。薪水是双精度的,胜利是小的。
0赞 Adrian Klaver 6/4/2023
然后,您需要根据我之前的评论添加。CAST
0赞 Sharon R. 6/4/2023
这给了我这个错误: SQL 错误 [42601]: 错误: 语法错误在或接近 “:” 位置: 452 错误位置: 行: 193 位置: 451
1赞 Adrian Klaver 6/4/2023
这太过分了,因为除非有零星的胜利,否则这是正确的类型。临时查询是您在创建查询时经常使用的东西,因此最好了解如何操作。特别是考虑到您通常无法更改表中的类型。integerCAST

答: 暂无答案