2009-07-29 10 views
36

かなり大きな数値のある整数列のテーブルがあります。私はこの中でいくつかの値を平均化しようとしていますが、それ以外のときにはこのエラーが発生します。平均を計算するときに算術オーバーフローを与えるSQL Server

"表現をデータ型intに変換する算術オーバーフローエラー。

私はそれを分解してきたし、このサンプルでは、​​エラー

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

を生産する誰もが、私は、これは平均値を計算するために得ることができる方法を知っていますか?

答えて

55

内部的にSQL Serverは値を合計して(後でカウントで除算する)、列データ型に格納します(この場合、合計を保持するのに十分な大きさではありません)。値をキャストすると最初はbigintとしてbigintにそれらの値を格納している値を合計します。おそらく十分大きいので、平均計算を進めることができます。

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

数値をintより大きな何か、例えばbigintegerにキャストする必要があります。平均的なSQLを計算するためには、すべての値をintとして合計しているので、オーバーフローしています。

+0

私はテーブルを簡単に変更することはできません。 – user129211