sql - 总和中的小数舍入?

标签 sql decimal rounding

我正在使用下表处理 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 .

但是底部的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 

关于sql - 总和中的小数舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13416993/

相关文章:

sql - MySQL,不解为什么查询慢,有索引吗?

SQL 存储过程 : If variable is not null, 更新语句

.net - .NET 中小数、浮点和 double 之间的区别?

python - 打印数字时添加千位分隔符

c++ - 创建舍入函数

SQL 查找完全包含给定集合的集合

mysql - 无法从查询中获取适当的值?

python - 转换日期 (YYYY MM DD HH :MM:SS) to Decimal Day (YYYY MM DD. ddddd)

Python 师 ://vs math. 楼

c# - 在 C# 中使用百分比