SQL Server在计算平均数时出现算术溢出错误

53

我有一个带有整数列的表格,其中有一些相当大的数字。我试图对其中一些值进行平均,有时候它可以正常工作,但有时候会出现以下错误:

"算术运算溢出错误,将表达式转换为数据类型int。"

我已经拆分了它,这个示例产生了错误。

create table LargeNumbers (number int)
insert into LargeNumbers values (100000000) -- X 30
select avg(number) from LargeNumbers

有人知道我该怎么让这个计算出平均值吗?

2个回答

97

在内部,SQL Server正在对这些值进行求和(以便稍后除以计数),并将它们存储在列数据类型中,本例中为int。然而,由于int类型不足以容纳总和,因此如果您首先将值强制转换为bigint,则它将对这些值进行求和,并将这些值存储在bigint中 - 这很可能足够大,然后平均计算可以继续进行。

select avg(cast(number as bigint)) from LargeNumbers

8
微软方面犯了多么愚蠢的设计错误啊。 - CraigP

7

您需要将数字转换为比int更大的类型,例如BigInteger,因为要计算平均值时,SQL将所有值作为int相加,这就是您溢出的地方。


我不能轻易更改表结构 - 所以我选择在查询期间执行此操作的答案。 - user129211

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接