如何使用正确的十进制/ $结果转换计算列

时间:2011-10-18 03:48:27

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

我在sql server 2008中有以下计算列

[Total] AS  CAST ( ((val1/(1000)) * [val2]) AS DECIMAL(18,2))  PERSISTED,

当val1 = 862500且val2 = 8时,计算值= 6896.00

我需要它为十进制/金钱,其中(862500/1000)* 8 = 6900.00(不是6896.00)。

2 个答案:

答案 0 :(得分:5)

BOL说:

  

警告:使用+, - ,*,/或%算术运算符时   执行int,smallint,tinyint或者的隐式或显式转换   bigint常量值为float,real,decimal或numeric数据   types,SQL Server在计算数据时应用的规则   表达式结果的类型和精度因而不同   查询是否自动参数化。

     

因此,查询中的类似表达式有时会产生   不同的结果。当查询不是自动参数化时,常量   value首先转换为numeric,其精度很大   足以在转换为之前保持常量的值   指定的数据类型。例如,将常数值1转换为   数字(1,0),常数值250转换为数字(3,   0)。

     

当查询自动参数化时,常量值始终为   在转换为最终数据类型之前转换为数字(10,0)。   当涉及/运算符时,不仅结果类型可以   类似查询的精度不同,但结果值可以   也有所不同。例如,自动参数化的结果值   查询包含表达式SELECT CAST(1.0 / 7 AS float)将   与不相同的查询的结果值不同   autoparameterized,因为自动参​​数化查询的结果   将被截断以适合数字(10,0)数据类型。更多   有关参数化查询的信息,请参阅简单参数化。

因此,您需要将[val1],1000和[val2]转换为float类型:

[Total] AS CAST ( ((CAST ([val1] as float)/CAST (1000 as float)) * CAST ([val2] as float)) AS DECIMAL(18,2)) PERSISTED

答案 1 :(得分:4)

我想出了这个:

SELECT  (cast(862500 as float)/cast(1000 as float) ) * 8  

returns 6900

使它成为2位小数....

SELECT  cast((cast(862500 as float)/cast(1000 as float) ) * 8  as decimal(18,2))

returns 6900.00

您的具体案例:

[Total] AS  CAST ( ((cast(val1 as float)/(1000)) * cast([val2] as float)) AS DECIMAL(18,2))  PERSISTED,