尝试在 PostgreSQL 中进行示例查询,但 ROUND 函数无法正常工作?我的语法有问题?



我正在学习一些在线课程,并尝试自己运行一些练习查询,以使用以下语法在示例表中计算"净销售额占库存的百分比":

SELECT (ROUND((SUM(payment.amount)/SUM(replacement_cost))*100),2) 
AS nsales2inventory_pct
FROM film
INNER JOIN inventory
ON film.film_id = inventory.film_id
INNER JOIN rental
ON inventory.inventory_id = rental.inventory_id
INNER JOIN payment
ON rental.rental_id = payment.rental_id
WHERE payment.amount > 0.00;

我得到了21%的正确结果,但我试图通过使用上面SELECT语句中所示的ROUND函数深入到一个更精确的数字中,同时将小数点后2位的要求添加到ROUND功能中,将结果从"数字"类型的21更改为"记录"数据格式的"21,2",这是我不熟悉的。我确信我不明白我做错了什么,因为我还不够深入,但有人能向我解释一下,在ROUND函数中包含聚合/数学运算符时,我必须如何调整它吗?

ROUND()函数对传递给它的任何数字进行四舍五入(精确到特定的小数位数(。它是求和的结果、简单表达式还是复杂表达式,或者只是一个普通数字,都无关紧要。

在您的情况下,您的第一行可能看起来像:

SELECT ROUND(SUM(payment.amount) / SUM(replacement_cost), 2)

请参阅以下示例来说明舍入:

select
round(21.34567) as r0,
round(21.34567, 1) as r1,
round(21.34567, 2) as r2,
round(21.34567, 3) as r3,
round(21.34567, 4) as r4 

结果:

r0  r1    r2     r3      r4      
--- ----- ------ ------- ------- 
21  21.3  21.35  21.346  21.3457 

在四舍五入到小数点后两位之前,尝试强制将商视为浮点

SELECT ROUND(100.0 * SUM(payment.amount) / SUM(replacement_cost), 2)
AS nsales2inventory_pct
FROM film
INNER JOIN inventory
...

我在您当前的表达式中看到的潜在问题是,Postgres可能将其视为整数除法,因此在您有机会四舍五入到小数点后两位之前丢弃小数部分。

最新更新