5

我正在使用下表处理 SQLServer 2008:

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

我期待与第一季度相同的结果,但我得到的结果是:

5
5

问题 3:

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

在这种情况下,我得到了我期望的结果:

4.75
5.00

所以,我想知道为什么第二季度没有得到预期的结果。我尝试了同样的例子,'秒'是小数(2,0)并且工作正常,所以我猜它与小数的大小有关,但在那种情况下,我无法弄清楚为什么 Q1 和 Q3 工作,而Q2 没有。

4

1 回答 1

4

结果sum(seconds)numeric(38,0)有意义的,因为您可以对任意数量的numeric(14,0)行求和,这样可以避免溢出较小的类型。

numeric(38,0)根据此处的解释,在顶部乘以0.95( ) 会得到结果。numeric(2,2)numeric(38,2)

但是底部的部分unionnumeric(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 
于 2012-11-16T13:03:12.160 回答