2009年2月20日金曜日

[SQL_Server] Query で割算の見落とし。

【目的】Queryで割算して、小数点第一位までパーセンテージを求める。

 ええ、常識かもしれないんですけどね、MEMO。

 割算には [ / ](スラッシュ) を用いるワケですが、
 「整数 ÷ 整数」して、戻り値には小数点付の精度を求める場合、ちょっと一手間必要。

 というのも、「整数(A) ÷ 整数(B)」の戻り値は『整数』だそうで。
 だから、[ 整数A ] か [ 整数B ] (若しくは両方)を、演算前に
 小数持ちタイプのデータ型に型変換してあげる必要があると。

** 例 **
SELECT ( 20 / 57 ) * 100 AS Straight
,( CAST( 20 AS FLOAT ) / 57 ) * 100 AS castFLOAT_Single
,( CAST( 20 AS FLOAT ) / CAST( 57 AS FLOAT ) ) * 100 AS castFLOAT
,( CAST( 20 AS DECIMAL ) / 57 ) * 100 AS castDecimal_Single
,( CAST( 20 AS DECIMAL ) / CAST( 57 AS DECIMAL ) ) * 100 AS castDecimal;


[Result]
Straight : 0
castFLOAT_Single : 35.0877192982456
castFLOAT : 35.0877192982456
castDecimal_Single: 35.087700
castDecimal : 35.0877192982456140

** ** **

 というコトで、ジブンは片側だけ [ FLOAT ] にキャストしてあげる方法をとった。

** 解決 **
SELECT CAST( ROUND( ( CAST( 20 AS FLOAT ) / 57 ) * 100 ,1 ,1 ) AS DECIMAL(4 ,1) ) AS N'切捨て'
,CAST( ROUND( ( CAST( 20 AS FLOAT ) / 57 ) * 100 ,1 ,0 ) AS DECIMAL(4 ,1) ) AS N'四捨五入';
** **** **

 何故に更に [ DECIMAL(4 ,1) ] にキャストしているかは、実行してみればわかる。




 

0 件のコメント: