Sql 计算比率只能得到0或1?

Sql 计算比率只能得到0或1?,sql,sql-server,tsql,sql-server-2005,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 @自动化率为十进制(3,2)@total_count和@automated_count是整数 不幸的是,@automation\u rate返回的唯一值是0或1。很明显这里有点不对劲,可能简单得可笑,但就我个人而言,我看不出来

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

select @automation_rate = 
  case 
    when @total_count = 0 then 0
    else @automated_count / @total_count
  end
@自动化率为十进制(3,2)@total_count和@automated_count是整数

不幸的是,@automation\u rate返回的唯一值是0或1。很明显这里有点不对劲,可能简单得可笑,但就我个人而言,我看不出来

基础resultset(我在一个表上循环)中的所有数据都是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
正如您所看到的,除了automated=total之外,所有值的比率都是0.00。我还有一个Excel电子表格,做同样的基本计算,每次都非常完美(即,就像“预期”列)

那么我哪里出了问题

(这是在MS SQL Server 2005上,可能会产生任何影响)


编辑感谢大家的回答。我假设整数取整部分会自动转换为十进制数据类型,而不是意识到它会进行计算、取整,然后转换,从而破坏了整数取整部分。每个人都有相似的答案,所以投票率都很高。

这似乎是由于整数数学,因为@automated\u count和@total\u 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)

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

尝试:


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

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

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

您的预期比率不是37.98,而是0.3798,即小于0.5,即为0。
automated\u count
total\u count
的数据类型是什么,它们是浮动的吗?不,它们是整数。你是对的,我在上面的陈述是不准确的。我正在用计算器计算这些数字,很快就把它们输入了37.98,而不是0.3798等等。谢谢,这非常有效。我不知道取整的问题,我想因为它将变成十进制数据类型,它会自动转换。我更喜欢在代码中显式,这样你的解决方案才会赢。@AaronBertrand-别担心,我拒绝了编辑。无论如何,你是对的,
DECIMAL(3,2)
不是一个好的选择。我对你的答案投了更高的票,因为你的答案比我的要完整得多
CONVERT(DECIMAL(6,2),@automated_count) / @total_count