我有一段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上,根本没有任何影响)
修改感谢大家的答案。我假设整数舍入部分,因为它正在移动到它会自动转换的十进制数据类型,而不是意识到它会进行计算,舍入,然后然后转换。每个人都有类似的答案,所以在周围投票。
答案 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。