2017-10-12 64 views
0

早些时候,结果集显示300.00,当它是如下面其中加法是贝因从两个不同的表colums发生 。小数除法精度

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

的哪些操作正在发生的colums是类型

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

我觉得我没有转换的事情正确的,但实际上我需要的结果是在一个字符串,所以我用 演员为Varchar(18)。我们可以解决这个问题,如果有任何操作发生在 这两列,它应该在两位小数返回结果和字符串格式那太。

回答

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