postgresql中的除法(/)没有给出我的答案


81

我有一个表software和列在它dev_costsell_cost。如果dev_cost为16000,sell_cost则为7500。

我如何找到要恢复的软件销售数量dev_cost

我已查询如下:

select dev_cost / sell_cost from software ;

它返回2作为答案。但是我们需要得到3,对吗?

这将是什么查询?提前致谢。


如果sell_cost是7500,我们需要出售3个软件来恢复dev_cost,即>16000。这是我的问题
zeewagon 2015年

4
尝试select ceil(16000::numeric/7500)
Vivek S.

有效。谢谢wingedpanther :)
zeewagon 2015年

1
从软件中选择ceil(dev_cost :: numeric / sell_cost);--worked
zeewagon

Answers:


137

您的列具有整数类型,并且整数除法会将结果截断为0。为了获得准确的结果,您需要将至少一个值强制转换为float或小数

select cast(dev_cost as decimal) / sell_cost from software ;

要不就:

select dev_cost::decimal / sell_cost from software ;

然后,您可以使用ceil()函数将结果四舍五入到最接近的整数:

select ceil(dev_cost::decimal / sell_cost) from software ;

(请参阅SQLFiddle上的演示。)


我们在谈论金钱。强制转换为小数,而不是浮点数。
Mike Sherrill'Cat Recall'15

@迈克:好点,尽管在OP的情况下不太重要。(他们所要求的只是四舍五入的整数除法;对于浮点数,它可以作为中间类型很好,至少除非原始值是bigints。)仍然是固定的。
Ilmari Karonen

@IlmariKaronen谢谢!你的回答帮助了我。
MRah

2
@MRah:很高兴能为您提供帮助。:)顺便说一句,您可以通过单击答案左上角的指向上方的三角形图标,将其投票,而不是对您认为有用的答案进行评论。这将为答卷者奖励声誉点,并让他们知道他们的答谢受到赞赏,也有助于使最佳答案升至页面顶部。
Ilmari Karonen

8

您可以将整数类型转换为numeric并使用ceil()函数来获取所需的输出

PostgreSQL ceil函数返回大于或等于数字的最小整数值。

SELECT 16000::NUMERIC / 7500 col 
      ,ceil(16000::NUMERIC / 7500) 

结果:

col                  ceil 
------------------   ---- 
2.1333333333333333     3    

所以你的查询应该是

select ceil(dev_cost::numeric/sell_cost) 
from software

4

您还可以将变量转换为所需的类型,然后应用除法:

 SELECT (dev_cost::numeric/sell_cost::numeric);

您可以四舍五入您的值,并指定点后的位数:

SELECT TRUNC((dev_cost::numeric/sell_cost::numeric),2);

每个操作数是否真的需要使用:: decimal?
OV

1

此查询会将结果四舍五入到下一个整数

select round(dev_cost ::decimal / sell_cost + 0.5)

如果dev_cost碰巧是的整数倍,则会给出错误的结果sell_cost请参见示例
Ilmari Karonen 2015年

此查询可以。但是,如果表中的值更多,例如dev_cost为6000而sell_cost为400,则答案15是正确的。但是您的查询给出了16作为答案。我们应该做什么?我是SQL新手,如果输入错误,请更正我。
zeewagon 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.