2016-10-04 17 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

クエリは、それは(日付の明らかな例外を除いて)情報です取得されたテーブルのすべてのフィールドは、お金やdecimal型のいずれかとして定義されています。

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) 

を、次の試してみてくださいでしたあなたは、私は列の値を乗算てることがわかります10進数で1.0 これは結果を10進数に変換します それ以外の場合、VatInputが整数である場合、それ以上の計算は整数で表されます

関連する問題