[SQLServer] SQLの割り算(除算)に注意

SQLで割り算(除算)をすることがある。

消費税だったり、利益率だったり、パーセンテージなものから値を出したいときは多々ある。

消費税だったら、 原価 × ( 消費税率 / 100) で、消費税を出す。

しかし、何も考えずにこの計算式を実行していたら問題だった。

当たり前なのだが、消費税率に該当する部分が、整数型の場合、100%未満の場合は必ず0になる。
なので、ほぼ消費税が0となる。
プログラムで書くときは何となくキャストをしているが、SQL になると忘れていた。

DECLARE @intPer INT
SET @intPer = 8

SELECT 1000 * (@intPer/100) ,@intPer/100 ;
-- 0 0

SELECT 1000 * @intPer / 100 ,@intPer/100 ;
-- 80 0

SELECT 1000 * CAST((@intPer/100) AS NUMERIC) ,@intPer/100 ;
-- 0 0

SELECT 1000 * ( CAST(@intPer AS NUMERIC)/100) ,@intPer/100 ;
-- 80.0000000 0

SELECT 1000 * ( CAST(@intPer AS FLOAT)/100) ,@intPer/100 ;
-- 80 0

SQLも、プログラムと同じくキャストが必要。
もちろん、パーセンテージを入れる変数が、もともと小数点型であれば問題ない。
しかし、その場合は出力される値が小数点を含む可能性がある。

今回の場合、1円以下の小数点は切り捨てだったので、先に乗算した後、100で除算する方法を選んだ。

ちなみに、パーセンテージが0の場合は、除算するとすべて0となった。
0は何で割っても0という仕様のようだ。

One comment on “[SQLServer] SQLの割り算(除算)に注意

  1. ローマ帝国第5代皇帝ネロ・クラウディウス・カエサル・アウグストゥス・ゲルマニクス 2019年7月26日 4:08 PM

    ありがとうございました。税率計算が正確にできるようになりました。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>