问题:为什么SUM
返回的是 4 位小数(如预期),但Avg
返回的是 6 位小数?
CREATE TABLE #t(Col DECIMAL(19,4))
INSERT #t VALUES (123456.1200),(654321.3400)
SELECT SUM(Col), AVG(Col) FROM #t
总金额 | 平均金额 |
---|---|
777777.4600 | 388888.730000 |
备注:请注意,问题不是我们如何显示AverageAmount
4 位小数,而是为什么AverageAmount
返回 6 位小数。这是一个错误还是背后有一些合理的原因?我在 Windows 11 上使用最新版本的 SQL Server 2022
的数据类型
SUM(Col)
为DECIMAL(38,4)
。这是有道理的,因为添加
DECIMAL(x,4)
永远不会增加所需的规模。 4 位小数始终就足够了(并且允许的精度38
最大化在遇到溢出之前可以添加的元素数量)。然后
AVG(Col)
获取该DECIMAL(38,4)
结果并对其进行除法运算。COUNT_BIG
是,BIGINT
因此具有的精度为19
,比例为0
。你可以通过
返回
根据此处的规则,此除法的结果将具有假设的数据类型
decimal(58,24)
但是这种数据类型是不可能的,因为最大精度是
38
,而且你进一步满足了规则这些截断规则的完整扩展如下。
对于任何
decimal
规范@p1
,@p2
和@s2
始终具有与 相同的值,SUM
始终decimal
具有精度38
,并且它始终会被 除以bigint
。尝试不同的 值@s1
表明结果确实始终为decimal(38, greatest(s,6))
https://learn.microsoft.com/en-us/sql/t-sql/functions/avg-transact-sql?view=sql-server-ver16
对小数(p,s)进行 AVG 计算,结果为小数类型(38,max(s,6))
对 decimal(p,s) 进行求和,结果为 decimal(38,s)
所以这不是一个错误,只是它的工作方式而已。