计算比率只给0或1?

时间:2012-07-03 17:11:04

标签: sql sql-server tsql sql-server-2005

我有一段T-SQL代码看起来像这样:

select @automation_rate = 
  case 
    when @total_count = 0 then 0
    else @automated_count / @total_count
  end

@automation_rate是十进制(3,2)。 @total_count和@automated_count是整数。

不幸的是,为@automation_rate返回的唯一值是0或1.显然这里有一些错误,它可能是非常简单的,但对于我的生活,我看不到它。

基础结果集中的所有数据(我在表上循环)是0或正整数。除自动化率外,所有值均为整数。

以下是示例值和预期(使用计算器)与实际结果:

automated count     total count     expected ratio     actual ratio
---------------     -----------     --------------     ------------
              0              35                0.0             0.00
             98             258              37.98             0.00
             74             557              13.29             0.00
            140             140               1.00             1.00

正如您所看到的,除了自动=总数之外,所有值的比率均为0.00。我还有一个Excel电子表格,它执行相同的基本计算,并且每次都是完美的(即就像“预期”列一样)。

那我哪里出错了?

(这是在MS SQL Server 2005上,根本没有任何影响)

修改感谢大家的答案。我假设整数舍入部分,因为它正在移动到它会自动转换的十进制数据类型,而不是意识到它会进行计算,舍入,然后然后转换。每个人都有类似的答案,所以在周围投票。

4 个答案:

答案 0 :(得分:10)

这似乎是由于整数数学,因为@automated_count和@total_count显然是整数。你需要说:

1.0*@automated_count / @total_count

或更明确地说:

CONVERT(DECIMAL(5,2), @automated_count) / @total_count

这些也会产生0.3798等等,所以你可能想要:

CONVERT(DECIMAL(5,2), 100.0*@automated_count / @total_count)

答案 1 :(得分:4)

由于除法时使用的两个值都是整数,因此它返回一个整数。您需要将其中一个转换为十进制才能使其正常工作:

CONVERT(DECIMAL(6,2),@automated_count) / @total_count

答案 2 :(得分:2)

使用整数进行数学运算时,SQL Server会轮回。

尝试:

    select @automation_rate =
    case
      when @total_count = 0 then 0.00
     else (@automated_count * 1.00) / @total_count
   end

答案 3 :(得分:1)

你正在截断。任何处理所有整数和没有双精度的东西总是会截断为int。 0.x将最终为0。