SQL Server devuelve "Error de desbordamiento aritmético al convertir la expresión al tipo de datos int".

19

Cuando ejecuto este comando con SUM()

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

Me estoy poniendo,

Arithmetic overflow error converting expression to data type int.

¿Alguna idea de cuál es la causa?

Solo estoy siguiendo las instrucciones de esta respuesta .

Evan Carroll
fuente

Respuestas:

25

Para valores mayores que el INTmáximo (2,147,483,647), querrá usar 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;

Si está sucediendo en el SUM, debe convertir Amounta a 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;
Erik Darling
fuente
2
¿SQL Server no promueve automáticamente de int a bigint? #TIL Entonces, si estás sumando eso podría ser bigint, debes incluir el valor CONVERT(). Hermosa.
Evan Carroll
¿Cómo funcionó su ejemplo sobre esa pregunta, y el mío no funcionó entonces? Es tu respuesta?
Evan Carroll
@EvanCarroll ¡No estoy seguro! Supongo que es posible que la distribución de valores aleatorios fuera diferente y la mía sesgada lo suficientemente baja como para no convertirse en a BIGINT. Sin embargo, esa es mi mejor suposición.
Erik Darling
@EvanCarroll Escribí un dbfiddle después de hablar de ello con Paul W. con un ejemplo más eficiente, solo tenga en cuenta que no se ejecutará en dbfiddle debido a los requisitos de partición: dbfiddle.uk/…
Erik Darling