2011-11-27 13 views
27

Używam SQL Server 2008 R2 i mam kolumnę INT gdzie dane nigdy wstawiony przewyższa max INT, ale muszę zapytać, który wykorzystuje funkcję SUM które po wykonaniu przewyższa limit max INT i wyrzuca błąd, o którym mowa w tytule.Jak zapobiec błędom przepełnienia arytmetycznego podczas korzystania z kolumny SUM na INT?

Chcę móc wykonać to zapytanie bez zmiany typu kolumny z INT na BIGINT.

Oto moje zapytanie:

SELECT UserId, 
      SUM(PokemonExp)  AS TotalExp, 
      MAX(PokemonLevel) AS MaxPokeLevel 

FROM  mytable 

GROUP BY UserId 
ORDER BY TotalExp DESC 

Uwaga: Kolumna PokemonExp jest typu INT.

Odpowiedz

54

Rodzaj wyrażenia w SUM określa typ zwrotu.

Spróbuj wykonać następujące czynności:

SELECT UserId, 
      SUM(CAST(PokemonExp AS BIGINT)) AS TotalExp, 
      MAX(PokemonLevel)     AS MaxPokeLevel 

FROM  mytable 

GROUP BY UserId 
ORDER BY TotalExp DESC 
+0

poprawna odpowiedź bardzo dziękuję – MonsterMMORPG

+0

Na co warto, to samo się nie dzieje z AVG, nawet jeśli to tylko sumą swoich wartości, które jest przepełnione. –

1

Nie musisz zmienić typ kolumny do BIGINT aby uzyskać właściwą sumę.

Wystarczy CAST lub CONVERTPokemonExp do BIGINTprzed Ci wykonać SUM jak następuje:

SUM(CAST(PokemonExp AS BIGINT)) 
0

Zaakceptowany rodzaj ekspresji w SUM określa typ zwracany.

Spróbuj wykonać następujące czynności:

SELECT UserId, 
      SUM(CAST(PokemonExp AS BIGINT)) AS TotalExp, 
      MAX(PokemonLevel)     AS MaxPokeLevel 

FROM  mytable 

GROUP BY UserId 
ORDER BY TotalExp DESC 
+0

Czy 'CAST (PokemonExp AS BIGINT)' nie jawnie rzutuje wynik na 'BIGINT', który był przeciwieństwem tego, co OP chciał? – SuperBiasedMan

Powiązane problemy