Sql 计算比率只能得到0或1?
我有一段T-SQL代码,看起来像这样: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。很明显这里有点不对劲,可能简单得可笑,但就我个人而言,我看不出来
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