2016-10-04 2 views
1

Ich habe die folgende SQL-Abfrage.SQL-Rundung scheint nicht wie erwartet zu funktionieren

 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 

Wenn dies ausgeführt wird, erzeugt es das folgende Ergebnis;

enter image description here

Alle Felder in den Tabellen, aus denen die Abfrage es Informationen (mit der offensichtlichen Ausnahme der Daten) werden als entweder Geld oder Dezimal-Typen definiert wird immer.

In Wirklichkeit ist die Box4 Figur sollte 1351,17 und die box5 Zahl sollte sein sein -1.351,17

Kann mir jemand sagen, warum ich die Ergebnisse zu sehen bin, die ich bin, und was ich sollte getan haben zu bekommen das Ergebnis, das ich erwartet hatte?

Dank

+2

'DECLARE @ Box4 DECIMAL = '1.234' SELECT @ Box4' ergibt' 1', da es keine Skalierung/Genauigkeit in der Deklaration der Variablen gibt ... –

+0

@AlexK. Du schlägst mich um ungefähr 30 Sekunden :-) –

+0

@AlexK. Du hast absolut recht, Junge, kann ich manchmal dicht sein. –

Antwort

3
@Box4 DECIMAL 
     ^^^ here is your problem 

Du hast nie Ihre DECIMAL Typen jede Präzision hinter dem Komma. Daher zeigt SQL Server die Werte mit Nullstellen der Genauigkeit nach dem Dezimalpunkt, d. H. Als Ganzzahlen.

Da Sie scheinen zwei Dezimalstellen Präzision zu wollen, versuchen Sie, diese Erklärung mit:

@Box4 DECIMAL(10,2) 
0

Könnten Sie bitte versuchen Sie folgende

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

Sie werden feststellen, dass ich die Spalte Wert bin Multiplikation mit einer Dezimalzahl 1.0 Dies wird das Ergebnis in eine Dezimalzahl konvertieren Andernfalls, wenn der VatInput ist ganzzahlige Berechnungen darüber wird in Integer

sein 210
Verwandte Themen