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



我在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)

BOL说:

注意:当您使用+、-、*、/或%算术运算符来执行int、smallint、tinyint或的隐式或显式转换将Bigint常量值转换为浮点、实数、十进制或数字数据类型,即SQL Server计算数据时应用的规则表达式结果的类型和精度取决于查询是否自动参数化。

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

当查询被自参数化时,常量值总是在转换为最终数据类型之前转换为数字(10,0)。当使用/操作符时,不仅可以使用结果类型的相似查询的精度不同,但结果值可以也不同。例如,自参数化的结果值包含表达式SELECT CAST (1.0/7 AS float)的查询将不同于非相同查询的结果值自参数化,因为查询的结果是自参数化的将被截断以适应数字(10,0)数据类型。更多的关于参数化查询的信息,请参见简单参数化。

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

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

我想到了这个:

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,

最新更新