除算(/)がpostgresqlで私の答えを与えていない


85

私はテーブル持っているsoftwareとして、それにと列をdev_costsell_costdev_costが16000で、sell_costが7500の場合。

回復するために販売するソフトウェアの数量を見つけるにはどうすればよいdev_costですか?

私は以下のように質問しました:

select dev_cost / sell_cost from software ;

答えとして2を返しています。しかし、3を取得する必要がありますよね?

そのためのクエリは何でしょうか?前もって感謝します。


Sell_costが7500の場合、dev_costを回復するために3つのソフトウェア、つまり> 16000を販売する必要があります。それが私の質問です
zeewagon 2015

4
試してみてくださいselect ceil(16000::numeric/7500)
Vivek S. 2015

機能した。ありがとうwingedpanther :)
zeewagon 2015

1
ソフトウェアからceil(dev_cost :: numeric / Sell_cost)を選択します。
zeewagon 2015

回答:


143

列には整数型があり、整数除算は結果をゼロに向かって切り捨てます。正確な結果を得るには、少なくとも1つの値をfloatまたはdecimalキャストする必要があります。

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:良い点ですが、OPの場合は問題になる可能性は低いです。(彼らが求めているのは、切り上げる整数除算だけです。少なくとも元の値がbigintでない限り、floatはその中間型として問題なく機能します。)それでも修正されました。
Ilmari Karonen 2015

@IlmariKaronenありがとうございます!あなたの答えは私を助けました。
MRah 2017年

2
@MRah:お役に立ててうれしいです。:)ところで、役立つと思う回答にコメントする代わりに、回答の左上隅にある上向きの三角形のアイコンをクリックして投票することができます。これにより、回答者にレピュテーションポイントが与えられ、回答が高く評価されていることがわかります。
Ilmari Karonen 2017年

9

整数型をキャストしnumericceil()関数を使用して目的の出力を取得できます

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

5

変数を目的の型にキャストしてから、除算を適用することもできます。

 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.