【问题标题】:SQL Server giving arithmetic overflow when calculating avgSQL Server在计算平均值时给出算术溢出
【发布时间】:2009-07-29 02:02:03
【问题描述】:

我有一个表,其中包含一个整数列,其中包含一些相当大的数字。我试图对此中的一些值进行平均,有时它会在其他时候工作,它会给出这个错误

“将表达式转换为数据类型int的算术溢出错误。”

我已经把它分解了,这个示例产生了错误

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

有谁知道我怎样才能得到这个来计算平均值?

【问题讨论】:

    标签: sql-server types


    【解决方案1】:

    SQL Server 在内部对值求和(稍后除以计数)并将它们存储在列数据类型中 - 在本例中为 int - 它不足以容纳总和 - 如果您将值转换为首先是一个 bigint,它会将这些值相加,并将这些值存储在一个 bigint 中 - 这可能足够大,然后可以继续进行平均计算。

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

    【讨论】:

    • 微软的设计错误多么愚蠢。
    【解决方案2】:

    您需要将 number 转换为大于 int 的值,比如 biginteger,因为计算平均 SQL 是将所有值相加为 int,这就是您溢出的地方。

    【讨论】:

    • 我无法轻松更改表结构 - 所以我会选择在查询期间执行此操作的答案
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多