我在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/

10-13 04:38