2012-03-30 5 views
0

Эта оценка в sql не работает должным образом по какой-либо причине, но я не могу понять, почему.SQL Math оценить Issue

Давайте сначала возьмем этот пример.

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 acording мне правильно. Но sql продолжает давать мне 0,000 в качестве ответа. Есть идеи?

ответ

3

Проблема в том, что ((2)/(4)) округляется до INT, так как 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