2012-11-16 12 views
5

Sto lavorando a SQLServer 2008 con la seguente tabella:arrotondamento decimale in unione di somme?

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

colonna 'secondi' è definito come un decimale (14,0) e l'unica riga nella tabella è quella mostrata.

così cerco alcune domande:

Q1:

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

Dà il risultato mi aspetto:

4.75 
5.00 

Q2:

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

mi aspettavo il stesso risultato come in Q1 ma il resu lt che ottengo è:

5 
5 

Q3:

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

In questo caso ho ottenere i risultati che si aspettano:

4.75 
5.00 

Quindi, vorrei sapere perché Q2 non è sempre i risultati attesi. Ho provato lo stesso esempio con 'seconds' è un decimale (2,0) e funziona bene quindi suppongo che abbia qualcosa a che fare con la dimensione del decimale, ma in quel caso non riesco a capire perché Q1 e Q3 funzionano mentre Q2 no.

+0

Sto provando con decimale (2,0) e non sembra funzionare né –

risposta

4

Il risultato è sum(seconds)numeric(38,0) che ha senso come si potrebbe essere sommando un numero qualsiasi di numeric(14,0) righe e questo evita traboccante un tipo più piccolo.

Moltiplicando un numeric(38,0) da 0.95 (numeric(2,2)) nella parte superiore dà un risultato di numeric(38,2) come da explanation here.

Ma la parte inferiore del union è numeric(38,0) così il risultato nel suo complesso viene colata a numeric(38,0) qual cosa ha senso come numeric(38,2) può sempre cast numeric(38,0) senza errori (anche se con una perdita di cifre dopo il decimale) ma colata del l'altro modo non funzionerà affatto per numeri molto grandi.

È possibile eseguire esplicitamente la parte inferiore su numeric(38,2) per evitare questo.

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

Grazie mille. Ora capisco :) –