Cuidado com os tipos de dados MONEY e SMALLMONEY
Os tipos de dados MONEY e SMALLMONEY armazenam um número com precisão de até 4 dígitos, gerando alguns problemas em cálculos. Para entender este comportamento vamos criar uma tabela contendo duas colunas MONEY e realizar um cálculo simples de percentual.
Consulta 1
Tipo de dado MONEY
DECLARE @MoneyTab TABLE (Total MONEY, Parte MONEY); INSERT INTO @MoneyTab (Total, Parte) VALUES (271.00, 199.50), (4639.00, 4316.00), (8031.00, 7862.00) SELECT Parte, Total, (Parte / total) * 100 AS Percentagem FROM @MoneyTab Go
Agora vamos criar a mesma tabela com os mesmos dados, utilizando o tipo de dado DECIMAL.
Consulta 2
Tipo de dado DECIMAL
DECLARE @DecimalTab TABLE (Total DECIMAL(19, 4), Parte DECIMAL(19, 4)); INSERT INTO @DecimalTab (Total, Parte) VALUES (271.00, 199.50), (4639.00, 4316.00), (8031.00, 7862.00) SELECT Parte,Total, (Parte / Total) * 100 AS Percentagem FROM @DecimalTab Go
O resultado no calculo da Percentagem foi gerado com precisão superior a 4 dígitos, para reduzir a precisão vamos utilizar a função de conversão CAST, reduzindo para os mesmos 2 dígitos utilizado na Consulta 1 (tipo de dado MONEY).
Consulta 3
Tipo de dado DECIMAL com CAST.
DECLARE @DecimalTab TABLE (Total DECIMAL(19, 4), Parte DECIMAL(19, 4)); INSERT INTO @DecimalTab (Total, Parte) VALUES (271.00, 199.50), (4639.00, 4316.00), (8031.00, 7862.00) SELECT Parte,Total, cast((Parte / Total) * 100 as decimal(19,2)) AS Percentagem FROM @DecimalTab Go
Comparando os resultados:
Repare que o valor gerado pelo tipo de dado MONEY não arredonda o valor, simplesmente corta na precisão dos dois números utilizados no cálculo!
Este comportamento pode gerar diferenças importantes nos valores quando agrupamos no mês, ano, etc. Devemos evitar também utilizar MONEY e SMALLMONEY em Data Warehouse, pois é comum utilizar cálculos agregados com grandes volumes de números, potencializando a diferença no resultado.
Até o próximo post.
Saudações Tricolores,
Landry
Have you ever thought about including a little bit more than just your articles?
I mean, what you say is valuable and all. However just imagine if you added some
great images or videos to give your posts more, “pop”!
Your content is excellent but with pics and
clips, this site could undeniably be one of the most beneficial
in its niche. Fantastic blog! https://seekingalpha.com/user/50543485/comments
Unquestionably believe that which you said. Your favorite reason seemed to be on the web the simplest
thing to be aware of. I say to you, I certainly get annoyed
while people think about worries that they just don’t
know about. You managed to hit the nail upon the top and also defined out the whole thing without having
side-effects , people could take a signal. Will likely be back
to get more. Thanks https://thriveglobal.com/authors/angel-laris