2012-11-16 22 views
5

Ben aşağıdaki tabloya SQLServer 2008 üzerinde çalışıyorum:Toplamlar birliğinde ondalık yuvarlama?

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

Sütun 'saniye' bir ondalık (14,0) ve tabloda yalnızca satır olarak tanımlanır gösterilen biridir.

yüzden bazı sorgular deneyin:

S1:

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

O beklediğim sonuçları verir:

4.75 
5.00 

S2:

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

bekliyordum Q1 ile aynı sonuç ama resu lt I olsun:

5 
5 

S3: Bu durumda

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

Ben sonuç beklediğim olsun: Yani

4.75 
5.00 

, ben Q2 almıyor neden bilmek istiyorum beklenen sonuçlar. Aynı örneği "saniye" ondalık (2,0) olarak denedim ve iyi çalışıyor, bu yüzden ondalık büyüklüğüyle ilgili bir şey olduğunu tahmin ediyorum, ancak bu durumda Q1 ve Q3'ün neden çalıştığını anlayamıyorum Q2 ise değil.

+0

geri ondalık (2,0) ile çalışıyorum ve o da –

cevap

4

sum(seconds) sonucu size numeric(14,0) satır herhangi bir sayıda toplayarak olabilir olarak mantıklı ve bu, daha küçük türü taşan kaçınır numeric(38,0) olduğunu. Bir numeric(38,0) üst kısmında 0.95 (numeric(2,2)) ile explanation here göre numeric(38,2) bir sonuç çarpımı

.

Ama union alt kısmı numeric(38,0) yüzden numeric(38,2) daima (ondalık hanelerin kaybıyla olsa) hatasız numeric(38,0) yayın yapabilirsiniz olarak yeniden anlam kazandı bir bütün numeric(38,0) artığını olarak sonuç ancak döküm olduğunu diğer yol çok büyük sayılarda işe yaramaz.

Bunu önlemek için alt kısmı numeric(38,2)'a açıkça dökülebilir.

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

Çok teşekkür ederim çalışmak görünmüyor. Şimdi anlıyorum :) –