2009-07-29 10 views
36

Ich habe eine Tabelle mit einer Integer-Spalte mit einigen ziemlich großen Zahlen drin. Im Versuch, einige Werte in diesen mitteln und manchmal funktioniert es andere Zeiten gibt es diesen FehlerSQL Server arithmetischen Überlauf bei der Berechnung avg geben

„Arithmetischer Überlauffehler Ausdruck in dem Datentyp int zu konvertieren.“

Ich habe es zerlegt und diese Probe erzeugt die Fehler

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

Wer weiß, wie ich dies den Durchschnitt berechnen erhalten kann?

Antwort

55

Intern summiert SQL Server die Werte (um sie später zu dividieren) und speichert sie im Datentyp columns - in diesem Fall ein int -, der nicht groß genug ist, um die Summe zu speichern - wenn Sie den Wert umsetzen als Bigint zuerst summiert er die Werte und speichert diese Werte in einem Bigint - was wahrscheinlich groß genug ist, dann kann die Durchschnittsberechnung fortfahren.

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

Sie benötigen Nummer etwas größer als ein int zu werfen, sagen einen BigInteger, weil die durchschnittliche SQL berechnen alle Werte als int wird summiert, und das ist, wo Sie sind überfüllt.

+0

Ich kann die Tabelle Struktur leicht ändern - so gehe ich mit der Antwort, die dies während der Abfrage tut – user129211

Verwandte Themen