4

我有一段 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

4 回答 4

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)
于 2012-07-03T17:13:10.673 回答
4

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

CONVERT(DECIMAL(6,2),@automated_count) / @total_count
于 2012-07-03T17:14:49.063 回答
2

当您使用整数进行数学运算时,SQL Server 会进行四舍五入。

尝试:

    select @automation_rate =
    case
      when @total_count = 0 then 0.00
     else (@automated_count * 1.00) / @total_count
   end
于 2012-07-03T17:14:47.330 回答
1

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

于 2012-07-03T17:15:45.000 回答