2012-11-16 103 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

非常感谢。我现在知道了 :) –