我正在使用下表处理 SQLServer 2008:
id user program seconds
------------------------------------
9999 'user01' 'pr01' 5
列 'seconds' 被定义为十进制 (14,0) 并且表中唯一的一行是显示的那一行。
所以我尝试了一些查询:
问题 1:
select seconds*0.95 from myTable
union all
select seconds from myTable
它给出了我期望的结果:
4.75
5.00
问题 2:
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
所以,我想知道为什么 Q2 没有得到预期的结果。我已经尝试了相同的示例,其中 'seconds' 是小数(2,0)并且工作正常,所以我猜它与小数的大小有关,但在这种情况下,我无法弄清楚为什么 Q1 和 Q3 在工作时Q2 没有。
最佳答案
sum(seconds)
的结果是 numeric(38,0)
这是有道理的,因为您可以对任意数量的 numeric(14,0)
求和行,这避免了溢出较小的类型。
乘以 numeric(38,0)
来自 0.95
( numeric(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
关于sql - 总和中的小数舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13416993/