计算列在SQL Server中不起作用

时间:2014-05-13 18:41:15

标签: sql sql-server sql-server-2008-r2

我在SQL Server 2008 R2表中遇到计算列问题。

我有以下等式

round((([m1]+[m2]+[m3])/3),0)
计算列中的

,问题是如果你有m1=99m2=100m3=100,计算列中的结果应该是100,但我得到的是99 < / p>

谢谢

3 个答案:

答案 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)