2012-03-30 16 views
0

この評価は何らかの理由で正しく動作していないようですが、その理由を理解できません。SQL数学の問題

まずこの例を考えてみましょう。

DECLARE @countRatio decimal(6,3)  
SET @countRatio = (((4)/(2))*(6))/100.0 
_______________________________________ 
0,120 

この評価は魅力的です。私はまた、私の計算機で同じ答えを得る。

しかし、この例は私に予期しない答えを与えます。私は私の電卓でこれを計算すると

DECLARE @countRatio decimal(6,3)  
SET @countRatio = (((2)/(4))*(6))/100.0 
_______________________________________ 
0,000 

は答えが私た内容に応じて、が正しいです0.03 です。しかし、SQLは答えとして私に0,000を与え続けます。何か案は?

答えて

3

問題は、2と4の両方がINTsなので、に切り捨てられるという問題です。あなたの代わりに2.0または4.0を使用している場合は、正しい結果を得る:任意の算術式で

DECLARE @countRatio decimal(6,3)  
SET @countRatio = (((2.0)/(4))*(6))/100.0 
SELECT @countRatio 
========================== 
0.030 

を、SQL Serverがより高い精度を持つ演算子の型にキャストします。したがって、2.0/4は、結果をタイプ2.0にキャストします。これはfloatです。

2

2および4は整数なので、SQLでは整数除算が使用され、0となります。これは動作します:

DECLARE @countRatio decimal(6,3)  
SET @countRatio = (((2.0)/(4.0))*(6))/100.0 
0
declare @countRatio decimal(6,3)  

-- Using integers 2/4 = 0: 
set @countRatio = ((2/4) * 6)/100.0 
select @countRatio 

-- Using decimal values 2/4 = 0.5: 
set @countRatio = ((2./4.) * 6.)/100.0 
select @countRatio 

-- Explicitly converting a value to decimal will cause the other values to be promoted to decimal: 
set @countRatio = ((Cast(2 as Decimal)/4) * 6)/100.0 -- Decimals. 
select @countRatio 

-- Or: 
set @countRatio = ((Convert(Decimal, 2)/4) * 6)/100.0 -- Decimals. 
select @countRatio 

-- The promotion occurs when it is needed. Hence this doesn't do what you want: 
set @countRatio = ((2/4) * Convert(Decimal, 6))/100.0 -- Decimals. 
select @countRatio