2016-10-04 76 views
1

我有以下SQL查詢。SQL舍入似乎不按預期方式工作

 DECLARE 
    @StartDate DATE ='20160101' , 
    @EndDate DATE = '20160331', 

    @Box1 DECIMAL, 
    @Box2 DECIMAL, 
    @Box3 DECIMAL, 
    @Box4 DECIMAL, 
    @Box5 DECIMAL, 
    @Box6 DECIMAL, 
    @Box7 DECIMAL, 
    @Box8 DECIMAL, 
    @Box9 DECIMAL 


SET @Box1 = (SELECT ROUND(SUM (vt.Vat),2) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

SET @Box2 = (SELECT ROUND(SUM(vt.VatDueOnECPurchases/vt.ConversionFactor),2) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

SET @Box3 = (SELECT ROUND(SUM(@Box1 + @Box2),2)) 

SET @Box4 = (SELECT (ROUND(SUM(vt.VatInput),2) + @Box2) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

SET @Box5 =(SELECT @Box3 - @Box4) 

SET @Box8 = (SELECT ROUND(SUM(vt.SlAway/vt.ConversionFactor),2) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

SET @Box9 = (SELECT ROUND(SUM(vt.PlAway/vt.ConversionFactor),2) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

SET @Box6 = (SELECT (ROUND(SUM(vt.SlHome),2) + @Box8) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

SET @Box7 = (SELECT (ROUND(SUM(vt.PlHome),2) + @Box9) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

SELECT @Box1 AS BOX1, @Box2 AS Box2, @Box3 AS Box3, @Box4 AS Box4, @Box5 AS Box5, @Box6 AS Box6, @Box7 AS Box7, @Box8 AS Box8, @Box9 AS Box9 

當它運行時,它會產生以下結果;

enter image description here

所有的查詢所獲得它的信息(與日期明顯的例外)表中的字段都定義爲貨幣或小數類型。

在現實中,Box4數字應該是1351.17和了Box5數字應爲-1351.17

誰能告訴我爲什麼我看到的是我的結果,我應該一直在做得到我期待的結果是什麼?

感謝

+2

'DECLARE @ Box4 DECIMAL ='1.234'SELECT @ Box4'結果爲'1',因爲變量聲明中沒有比例/精度... –

+0

@AlexK。你擊敗了我約30秒:-) –

+0

@AlexK。你絕對正確,有時候我可以變得密集。 –

回答

3
@Box4 DECIMAL 
     ^^^ here is your problem 

你從來沒有給你DECIMAL類型過去小數點任意精度。因此,SQL Server正在顯示小數點後的精度爲零的值,即整數。

既然你似乎想精確小數點後兩位,請嘗試使用此聲明:

@Box4 DECIMAL(10,2) 
0

能否請您嘗試以下

SET @Box4 = (SELECT (ROUND(SUM(vt.VatInput * 1.0),2) + @Box2) FROM VatTransactions vt WHERE vt.VatTransactionDate BETWEEN @StartDate AND @EndDate) 

你會發現,我乘列值用十進制數字表示1.0 這會將結果轉換爲十進制數字 否則,如果VatInput是整數,它將以整數計算