2017-10-12 98 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