web-dev-qa-db-ja.com

平均を計算するときに算術オーバーフローを与えるSQLServer

かなり大きな数が含まれる整数列のテーブルがあります。私はこれでいくつかの値を平均しようとしています、そして時々それはこのエラーを与える他の時に動作します

式をデータ型intに変換する際の算術オーバーフローエラー。

私はそれを分解しました、そしてこのサンプルはエラーを生成します

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

平均を計算するためにこれを取得する方法を誰かが知っていますか?

46
user129211

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

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

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

5
Stephen Nutt