SQL Server在计算avg时给出算术溢出

use*_*211 46 sql-server types

我有一个带有整数列的表,其中包含一些相当大的数字.我试图在这个中平均一些值,有时它可以在其他时候产生这个错误

"将表达式转换为数据类型int的算术溢出错误."

我把它分解了,这个样本产生了错误

create table LargeNumbers (number int)
insert into LargeNumbers values (100000000) -- X 30
select avg(number) from LargeNumbers
Run Code Online (Sandbox Code Playgroud)

有谁知道如何计算平均值?

Tet*_*ron 75

SQL Server内部对值进行求和(以后除以计数)并将它们存储在列数据类型中 - 在本例中为int - 其大小不足以保存总和 - 如果先将值转换为bigint它会将值存储在bigint中的值相加 - 这可能足够大,然后可以进行平均计算.

select avg(cast(number as bigint)) from LargeNumbers
Run Code Online (Sandbox Code Playgroud)

  • 微软这真是一个愚蠢的设计错误。 (2认同)

Ste*_*utt 5

你需要将数字转换为大于int的东西,比如说一个大整数,因为要计算平均SQL将所有值相加为int,这就是你溢出的地方.