2016-10-04 5 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에서는 소수점 이하의 정밀도가 0 인 값을 정수로 표시합니다.

@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이 정수 이상인 경우 정수로 나타납니다