我在SQL Server中遇到以下错误(或功能)。
当我使用SUM (*column*)
时,其中column
具有numeric(18, 8)
类型并将其乘以任何其他数字(整数或十进制),结果精度将降低为numeric(18, 6)
。
这是要演示的示例脚本。
CREATE TABLE #temp (Qnty numeric(18,8))
INSERT INTO #temp (Qnty) VALUES (0.00000001)
INSERT INTO #temp (Qnty) VALUES (0.00000002)
INSERT INTO #temp (Qnty) VALUES (0.00000003)
SELECT Qnty, 1*Qnty
FROM #temp
SELECT (-1)*SUM(Qnty), SUM(Qnty), -SUM(Qnty), SUM(Qnty) * CAST(2.234 as numeric(18,8))
FROM #temp
DROP TABLE #temp
第二次SELECT查询的结果
0.000000 0.00000006 -0.00000006 0.000000
如您所见,然后我将SUM相乘,结果是0.000000
谁能解释这个奇怪的行为?
UPD。我在2000、2005和2008 SQL Server的SQL Management Studio中执行了此查询。
最佳答案
将numeric(18, 8)
与SUM聚合将得到数据类型numeric(38, 8)
。
在此处将数值与数字相乘时,如何计算结果数据类型:Precision, Scale, and Length (Transact-SQL)
常数-1的数据类型为numeric(1, 0)
精度为p1 + p2 + 1
= 40
小数位数是s1 + s2
= 8
最大精度为38,因此您只需numeric(38, 6)
。
在此处阅读有关numeric(38, 6)
原因的更多信息:Multiplication and Division with Numerics
关于sql-server - 为什么将总和乘以其他数字时精度会降低,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14313598/