SQL Server는 "표현식을 int로 데이터 형식으로 변환하는 산술 오버플로 오류"를 반환합니다.


19

내가이 명령을 실행할 때 SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

나는 점점

Arithmetic overflow error converting expression to data type int.

그 원인이 무엇인지에 대한 아이디어가 있습니까?

이 답변 의 지침을 따르고 있습니다.

답변:


25

INT최대 값 (2,147,483,647) 보다 큰 값의 경우 COUNT_BIG (*) 를 사용하려고합니다 .

SELECT COUNT_BIG(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

에서 발생하는 경우 SUM으로 변환 Amount해야합니다 BIGINT.

SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

2
SQL Server가 int에서 bigint로 자동 승격되지 않습니까? #TIL 따라서 bigint 있는 값을 합산 하려면에 값을 래핑해야합니다 CONVERT(). 아름다운.
Evan Carroll

그 질문에 대한 당신의 모범은 어떻게 효과가 있었으며, 그때 내 것이 효과가 없었습니까? 당신의 대답입니까?
Evan Carroll

@EvanCarroll 확실하지 않습니다! 임의의 값 분포가 다를 수 있고 내 값이 낮아져서 충분하지 않을 수 있다고 가정합니다 BIGINT. 그래도 내 최고의 추측에 관한 것입니다.
Erik Darling

@EvanCarroll 더 효율적인 예를 들어 Paul W와 이야기 한 후에 dbfiddle을 작성했습니다. 분할 요구 사항 때문에 dbfiddle에서 실행되지 않습니다. dbfiddle.uk/…
Erik Darling

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.