十进制分割精度

时间:2017-10-12 07:42:30

标签: sql-server sql-server-2012

之前,结果集显示300.00,当时正如以下所示,正在进行添加 来自两个不同的表柱。

 Cast((SELECT Cost  FROM Table1 WHERE Id = CD.Id) + 
      (SELECT RecuritmentCost FROM Table2 WHERE Id = CD.Id)
 AS VARCHAR(10))

但我有一些要求在其中一个案例中进行除法操作 我在下面使用的声明导致300.0000000000000

cast((((
    SELECT Cost  
    FROM Table1 
    WHERE Id = CD.Id
    ) + (
    SELECT RecuritmentCost
    FROM Table2 
    WHERE Id = CD.Id
    ))/(Select Count(*) from tblEmployee where Id = CD.Id and emptype=2)) AS VARCHAR(18))

这里我使用了varchar(18)因为如果我使用varchar(10)

它会抛出错误

错误是“将数字转换为数据类型varchar的算术溢出错误”。

通过使用varchar(18),此错误已被删除,但结果开始显示300.0000000000000

正在进行操作的列的类型为

Cost(decimal(18,2),null)
RecuritmentCost(decimal(18,2), null)

我认为我没有正确地转换事物,但实际上我需要将结果放在字符串中,所以我正在使用 演员为Varchar(18)。如果发生任何操作,我们能解决这个问题吗? 这两列,它应该返回两个小数位的结果,也就是字符串格式。

1 个答案:

答案 0 :(得分:1)

首先,当您对具有不同数据类型的值进行算术运算时,SQL Server将选择它认为结果的最佳数据类型。您的查询是添加2个十进制值,然后除以整数(count(*))。然后,您将其投放到varchar。子查询结果的划分是导致结果改变类型的原因。

我不确定为什么要对varchar执行转换,只需将结果转换为decimal(18,2)以保持精度。如果您确实需要varchar的值,请先将其转换为decimal(18,2),然后转换为varchar

运行以下测试:

DECLARE @decimalValue DECIMAL(18, 2) = 300.00;

SELECT @decimalValue;
-- 300.00

SELECT CAST(@decimalValue + @decimalValue 
            / ( SELECT 3 ) AS VARCHAR(18)) AS ResultOriginal;
-- 400.0000000000000

SELECT CAST(@decimalValue + @decimalValue 
            / ( SELECT 3 ) AS DECIMAL(18,2)) AS ResultAsDecimal;
-- 400.00

SELECT CAST(CAST(@decimalValue + @decimalValue 
            / ( SELECT 3 ) AS DECIMAL(18,2)) AS VARCHAR(18)) AS ResultAsVarchar;
-- 400.00