我在SQL Server 2008 R2表中遇到计算列问题。
我有以下等式
round((([m1]+[m2]+[m3])/3),0)
计算列中的,问题是如果你有m1=99
,m2=100
和m3=100
,计算列中的结果应该是100,但我得到的是99 < / p>
谢谢
答案 0 :(得分:1)
这是因为你得到一个整数除法 * ,它会在到达ROUND
之前截断结果。逐步评估您的表达,看看发生了什么:
[m1]+[m2]+[m3]
,给你299 [m1]+[m2]+[m3]
的结果是整数除以3,得到99 ROUND(99, 0)
被调用,生成99
。以下是解决问题的方法:
ROUND((cast([m1]+[m2]+[m3] as decimal)/3),0)
Here is a running demo on sqlfiddle, which returns 100.
* 我假设您的所有三列都是整数,这与您观察到的行为一致。
答案 1 :(得分:0)
您必须将其转换为numeric
类型
ROUND((convert(numeric,[m1]+[m2]+[m3])/3),0)
答案 2 :(得分:0)
您只需要强制SQL Server使用十进制计算,而不是假设所有都是INT。您可以通过强制转换(正如其他人已经注意到的那样)或者您可以为其中一个操作数给它一个十进制值。由于你有一个硬编码的3,你可以使用那个加强.0
强制到十进制,如:
round((([m1]+[m2]+[m3])/3.0),0)