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

160

我有一个名为software的表格,其中包含dev_costsell_cost两列。如果dev_cost是16000,sell_cost是7500,那么我该如何找出需要销售多少份软件才能收回dev_cost

我的查询如下:

select dev_cost / sell_cost from software ;

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

那么查询应该是什么?


如果销售成本为7500,我们需要销售3个软件才能收回开发成本,即大于16000。这是我的问题。 - zeewagon
5
请尝试运行以下代码:select ceil(16000::numeric/7500)。该代码将返回结果并向上取整,计算出 16000 除以 7500 的结果。 - Vivek S.
1
select ceil(dev_cost::numeric/sell_cost) from software; --已经运行 - zeewagon
4个回答

284

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

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'
@Mike:说得好,虽然在OP的情况下不太可能有影响。(他们只是要求整数除法向上取整;浮点数作为中间类型就足够了,至少在原始值不是大整数的情况下如此。)不过还是修复了。 - Ilmari Karonen
2
@MRah:很高兴能提供帮助。:) 顺便说一句,如果你发现某个答案有用,不妨通过点击答案左上角的向上箭头图标来投票支持它。这将奖励回答者声望分,并让他们知道他们的回答受到了赞赏,同时也有助于最佳答案脱颖而出。 - Ilmari Karonen

12

你可以将整数类型转换为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

10

您还可以将变量转换为所需的类型,然后进行除法运算:

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

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

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

有必要为每个操作数使用 ::decimal 吗? - o.v

0
这个查询会将结果四舍五入到下一个整数。
select round(dev_cost ::decimal / sell_cost + 0.5)

1
如果dev_cost恰好是sell_cost的整数倍,那么这将得到错误的结果:查看示例 - Ilmari Karonen
这个查询没问题。但是如果表中有更多的值,比如说dev_cost是6000,sell_cost是400,答案15就是正确的。但是你的查询结果是16。我们该怎么办?我对SQL不熟悉,请纠正我如果我错了。 - zeewagon
使用round()或floor(x + 0.5),但不要使用round(x + 0.5)。 - J. B. Rainsberger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接