2012-11-16 3 views
5

Ich bin auf SQLServer 2008 mit der folgenden Tabelle arbeiten:Dezimalrundung in Vereinigung von Summen?

id  user  program seconds 
------------------------------------ 
9999 'user01' 'pr01'  5 

Spalte 'Sekunden als Dezimalzahl definiert (14,0) und die einzige Zeile in der Tabelle ist derjenige gezeigt.

Also versuche ich einige Fragen:

Q1:

select seconds*0.95 from myTable 
union all 
select seconds from myTable 

Es gibt das Ergebnis, das ich erwarten:

4.75 
5.00 

Q2:

select sum(seconds)*0.95 from myTable 
union all 
select sum(seconds) from myTable 

Ich hatte erwartet, die Das gleiche Ergebnis wie in Q1, aber das Ergebnis lt ich erhalte, ist:

5 
5 

Q3:

select sum(seconds)*0.95 from myTable 
union all 
select sum(seconds)*1.00 from myTable 

In diesem Fall habe ich die Ergebnisse erhalten, erwarte ich:

4.75 
5.00 

Also, ich möchte wissen, warum Q2 nicht ist immer die erwarteten Ergebnisse. Ich habe das gleiche Beispiel versucht, wobei 'Sekunden' eine Dezimalzahl (2,0) ist und gut funktioniert, also denke ich, dass es etwas mit der Dezimalzahl zu tun hat, aber in diesem Fall kann ich nicht herausfinden, warum Q1 und Q3 funktionieren während Q2 nicht.

+0

Ich versuche mit Dezimal (2,0) und es scheint nicht zu funktionieren –

Antwort

4

Das Ergebnis sum(seconds) ist numeric(38,0) was Sinn macht, wie Sie eine beliebige Anzahl von numeric(14,0) Reihen summiert werden könnten und dies vermeidet eine kleinere Art überfüllt.

ein numeric(38,0) von 0.95 (numeric(2,2)) im oberen Teil ein Ergebnis gibt Multipliziert numeric(38,2) gemäß den explanation here.

Aber der untere Teil der union ist numeric(38,0) so das Ergebnis als Ganze zu numeric(38,0) gegossen wird wieder was Sinn macht, wie numeric(38,2) immer numeric(38,0) ohne Fehler werfen kann (wenn auch mit einem Verlust von Stellen nach dem Komma), aber Gießen der Ein anderer Weg wird bei sehr großen Zahlen überhaupt nicht funktionieren.

Sie können den unteren Teil explizit auf numeric(38,2) umwandeln, um dies zu vermeiden.

SELECT sum(seconds) * 0.95 AS S 
FROM myTable 
UNION ALL 
SELECT CAST(sum(seconds) AS NUMERIC(38, 2)) 
FROM myTable 
+0

Vielen Dank. Ich verstehe jetzt :) –