Pergunta : Por que SUM
o retorno é com 4 casas decimais (como esperado), mas o Avg
retorno é com 6 casas decimais?
CREATE TABLE #t(Col DECIMAL(19,4))
INSERT #t VALUES (123456.1200),(654321.3400)
SELECT SUM(Col), AVG(Col) FROM #t
SomaQuantia | Valor médio |
---|---|
777777.4600 | 388888.730000 |
Observações : Observe que a questão NÃO é sobre como podemos exibir AverageAmount
com 4 decimais, mas por que AverageAmount
está retornando com 6 casas decimais. Isso é um bug ou há algum motivo válido por trás disso? Estou usando a versão mais recente do SQL Server 2022 no Windows 11
O tipo de dados de
SUM(Col)
éDECIMAL(38,4)
.O que faz sentido, já que adicionar
DECIMAL(x,4)
nunca pode aumentar a escala necessária. 4 casas decimais sempre serão suficientes (e permitir uma precisão de38
maximiza o número de elementos que podem ser adicionados antes de ocorrer um estouro).Em seguida, ele
AVG(Col)
pega esseDECIMAL(38,4)
resultado e realiza uma operação de divisão nele.COUNT_BIG
é um ,BIGINT
então tem uma precisão de19
e escala de0
.Você pode ver isso com
Que retorna
O resultado desta divisão teria um tipo de dado hipotético de acordo
decimal(58,24)
com as regras aquiMas esse tipo de dado não é possível, pois a precisão máxima é
38
e você atinge a regra mais abaixoUma expansão completa dessas regras de truncamento está abaixo.
Para qualquer
decimal
especificação@p1
,@p2
, e@s2
sempre tem o mesmo valor que oSUM
dedecimal
sempre tem precisão38
, e sempre será dividido porbigint
. Tentar valores diferentes de@s1
mostra que o resultado é de fato sempredecimal(38, greatest(s,6))
https://learn.microsoft.com/en-us/sql/t-sql/functions/avg-transact-sql?view=sql-server-ver16
AVG em decimais(p,s) resulta no tipo decimal(38, max(s,6))
SOMA em decimal(p,s) resulta em decimal(38,s)
Então não é um bug, é apenas a maneira como funciona.