2016-10-04 3 views
1

У меня есть следующий SQL-запрос.SQL Rounding не работает должным образом

 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 является целым числом вычислений над ним, будет целое число

Смежные вопросы