2011-11-27 23 views
27

Tôi đang sử dụng SQL Server 2008 R2 và tôi có một cột INT nơi dữ liệu chèn không bao giờ vượt qua max INT, nhưng tôi có một truy vấn trong đó sử dụng các SUM chức năng mà khi thực hiện vượt quá giới hạn tối đa INT và ném các lỗi nêu trong tiêu đề.Làm thế nào để ngăn chặn lỗi tràn số học khi sử dụng cột SUM trên INT?

Tôi muốn có thể thực hiện truy vấn này mà không thay đổi loại cột từ INT thành BIGINT.

Đây là câu hỏi của tôi:

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

FROM  mytable 

GROUP BY UserId 
ORDER BY TotalExp DESC 

Lưu ý: Cột PokemonExp là loại INT.

Trả lời

54

Loại biểu thức trong SUM xác định loại trả lại.

Hãy thử như sau:

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

FROM  mytable 

GROUP BY UserId 
ORDER BY TotalExp DESC 
+0

câu trả lời đúng thank you very much – MonsterMMORPG

+0

Đối với những gì nó có giá trị, tương tự có thể xảy ra với AVG, ngay cả khi nó chỉ là tổng các giá trị của bạn đó là tràn. –

1

Bạn không cần phải thay đổi kiểu cột để BIGINT để có được một khoản tiền thích hợp.

Chỉ CAST hoặc CONVERTPokemonExp-BIGINTtrước bạn thực hiện các SUM thích sau:

SUM(CAST(PokemonExp AS BIGINT)) 
0

loại được chấp nhận biểu hiện trong SUM xác định kiểu trả về.

Hãy thử như sau:

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

FROM  mytable 

GROUP BY UserId 
ORDER BY TotalExp DESC 
+0

Có 'CAST (PokemonExp AS BIGINT)' không rõ ràng đưa kết quả vào 'BIGINT', điều trái ngược với những gì OP muốn? – SuperBiasedMan

Các vấn đề liên quan