2012-11-16 141 views
5

我正在2008 SQLServer的按下表:小數四捨五入合併?

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

列「秒」被定義爲一個十進制(14,0)和在表中的唯一的行是示出的一個。

所以我嘗試了一些疑問:

Q1:

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

它給我希望得到的結果:

4.75 
5.00 

Q2:

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

我期待與Q1相同的結果,但結果LT我得到的是:

5 
5 

Q3:

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

在這種情況下,我得到的結果我想到:

4.75 
5.00 

所以,我想知道爲什麼Q2是沒有得到預期的結果。 我試過同樣的例子,'秒'是小數(2,0),工作正常,所以我想它與小數的大小有關,但在這種情況下,我不明白爲什麼Q1和Q3工作而Q2則沒有。

+0

我試着用十進制(2,0),它似乎並沒有工作 –

回答

4

sum(seconds)結果是numeric(38,0)這是有道理的,你可以總結任意數量的numeric(14,0)行,這避免溢出較小的類型。

相乘的numeric(38,0)通過在頂部部分0.95numeric(2,2))給出的numeric(38,2)結果作爲每explanation here

union的底部是numeric(38,0)所以作爲一個整體轉換爲numeric(38,0)其結果再次有意義的,因爲numeric(38,2)可以隨時轉換爲numeric(38,0)沒有錯誤(儘管有數字的小數點之後的損失),但鑄造其他方式根本無法用於非常大的數字。

您可以將底部明確地轉換爲numeric(38,2)以避免這種情況。

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

非常感謝。我現在知道了 :) –