Aprendemos a arredondar os números desde que éramos crianças. Quando você arredondar 1,15 para os décimos mais próximos, será 1,2 ou 1,1? Usar a função SQL ROUND para responder pode confundi-lo. Mais tarde, você verá o que quero dizer.
[id do formulário de envio=”12010″]
Aqui está outra pergunta. Qual é a soma de 1 + 1? Essa é uma pergunta bem idiota. É para crianças aprendendo matemática pela primeira vez, não para nós, adultos. Mas dê uma olhada no código abaixo:
-- Variables for input values
DECLARE @value1 DECIMAL(3,2) = 1.05
DECLARE @value2 DECIMAL(3,2) = 1.45
DECLARE @sum1 DECIMAL(3,2) = @value1 + @value2
-- Variables for rounded values
DECLARE @roundedValue1 TINYINT = ROUND(@value1,0)
DECLARE @roundedvalue2 TINYINT = ROUND(@value2,0)
DECLARE @sum2 TINYINT = ROUND(@sum1,0)
-- Surprise!
SELECT 'sum of ' + CAST(@value1 AS VARCHAR(4)) + ' + ' + CAST(@value2 AS VARCHAR(4)) AS Q1, @sum1 AS Sum1
SELECT 'sum of ' + CAST(@roundedValue1 AS VARCHAR(4)) + ' + ' + CAST(@roundedValue2 AS VARCHAR(4)) AS Q2, @sum2 AS Sum2
Então confira os resultados abaixo:
O que aconteceu aqui? Obtemos dois valores com uma parte decimal. Em seguida, arredondamos usando SQL ROUND para o número inteiro mais próximo. Suas somas também são arredondadas. Mas como pode 1 + 1 ser 3?!
Um profissional de SQL de olhos afiados identificará o problema no código imediatamente. Mas considere isso:
- Arredondar 2,5 para o número inteiro mais próximo é 3, não 2.
- A soma de 1 + 1 é 2.
É difícil, não é?
Aqui está o ponto. Se você não for cuidadoso, o SQL ROUND pode deixá-lo maluco. Isso também pode ser uma fonte de discussões entre desenvolvedores e contadores. Uma delas é quando se trata do princípio da materialidade. Os argumentos podem ficar feios.
O que você pode fazer?
Função redonda no SQL Server
Não, não estou dizendo para você passar esse problema para o próximo desenvolvedor. Este post lhe dará dicas essenciais para deixar você e seu usuário felizes com o resultado. Algumas dessas dicas também podem ser aplicadas ao arredondamento de um número no front-end do aplicativo ou em relatórios.
Vamos conferir nossas 5 dicas em detalhes.
Função de arredondamento para números em SQL
Você já sabe como arredondar números no SQL, então por que perguntar? Não se trata de perguntar como. Trata-se de perguntar quando. Você pode fazer perguntas semelhantes às abaixo:
- Você arredonda os valores de entrada ANTES de fazer os cálculos?
- Ou você calcula os valores de entrada e arredonda o resultado?
Mais perguntas podem surgir dependendo dos cálculos que você vai fazer.
O ponto é, se você obtém o arredondamento padrão ou modelo dos usuários. Em seguida, você pode usar esse modelo para escrever consultas. Você não assume ou adivinha o que levaria a um desacordo mais tarde. E se for útil incluir esse padrão como uma nota em algum lugar do relatório, faça-o.
Outra parte do padrão é quantas casas decimais usar. E se a coluna da tabela tiver um tipo de dados DECIMAL(10,4)? Como você vai arredondar para apenas 2 casas decimais?
Experimente o código abaixo:
DECLARE @value DECIMAL(10,4)
SET @value = 8346.1556
-- This will result in 8346.16 instead of 8346.1600
SELECT CAST(ROUND(@value, 2) AS DECIMAL(10,2))
O CAST após o ROUND exibirá apenas duas casas decimais. Os dois zeros serão truncados:
Compreensão Como o SQL arredonda para casas decimais
Aqui respondemos a nossa primeira pergunta. Quando você arredondar 1,15 para os décimos mais próximos, será 1,2 ou 1,1?
Primeiro, você verifica com o tipo de dados DECIMAL:
DECLARE @value DECIMAL(3,2)
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result in 1.2 or 1.20
O resultado do código acima é 1.20 ou 1.2:
Mas e se o tipo de dados for FLOAT? Vamos tentar mudá-lo.
DECLARE @value FLOAT
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result to 1.1
Qual é o resultado? é 1.1. Veja você mesmo:
Não é que eu queira lhe dar mais dúvidas. No entanto, você precisa saber que esses tipos de dados, embora usados para números, não são criados iguais .
- FLOAT e REAL são números aproximados, não recomendados para arredondamento – nem mesmo para verificações de igualdade em uma cláusula WHERE.
- DECIMAL e NUMERIC têm precisão e escala fixas, e nos referimos a eles como numéricos exatos. Portanto, quando arredondamos 1,15 para os décimos mais próximos, a resposta correta é 1,2.
- Os números inteiros também são numéricos exatos. Eles são seguros para arredondar dígitos inteiros.
O dilema começa no design da mesa. Você pode querer fazer algo sobre as colunas FLOAT ou REAL que serão arredondadas em algum lugar.
3. Use SQL ROUND na mesma fonte de dados para consistência
Suponha que você precise criar vários relatórios de receita para mostrar detalhes diferentes:o resumo, a divisão detalhada por tipo e a divisão detalhada por origem. Todos esses três relatórios tratarão centavos ou partes decimais como irrelevantes. Portanto, arredondar valores para números inteiros é inevitável.
Para obter resultados consistentes em todos os três relatórios, aplique o seguinte:
- SELECIONE nas mesmas tabelas base para garantir que os totais dos detalhes sejam consistentes com o resumo.
- Use o mesmo modelo para arredondamento (ponto 1 acima)
Você quer ficar satisfeito com seus usuários nesses relatórios de receita? Seja consistente sobre onde e como você obtém seus números.
4. SQL PISO ou TETO VS REDONDO
Pode haver casos em que você deve arredondar para cima ou para baixo para o próximo número inteiro. Neste caso, CEILING() ou FLOOR() é a escolha apropriada em vez de ROUND()
CEILING() arredonda um valor para o próximo inteiro:
SELECT CEILING(1); -- returns 1
SELECT CEILING(1.6); -- returns 2
SELECT CEILING(1.4); -- returns 2
Enquanto isso, FLOOR() arredonda para baixo:
SELECT FLOOR(1); -- returns 1
SELECT FLOOR(2.1); -- returns 2
SELECT FLOOR(2.9); -- returns 2
5. Teste os resultados com seus usuários
Depois de concluir todas as consultas e o design do relatório, a parte final é verificar seu trabalho com os usuários. Podemos cometer erros, não importa quão bons sejamos ou trabalhemos duro. Às vezes, precisamos de mais algumas iterações para acertar.
Seus usuários terão cenários de teste que garantirão a precisão dos relatórios. Ou ela pode ter um arquivo do Excel feito manualmente para comparar seu trabalho com o deles. Em qualquer caso, trabalhe com eles para um sistema melhor. Você ficará feliz por ter feito isso.
Conclusão
Trabalhar com SQL ROUND pode ser difícil às vezes. No entanto, as dicas apresentadas aqui provam que você pode vencer esses obstáculos. O que você aprendeu?
- Peça o padrão ou modelo de arredondamento de seus usuários.
- Conheça o tipo de dados que você está usando.
- Use ROUND na mesma fonte de dados para consistência.
- Às vezes, PISO ou TETO podem ser apropriados em vez de REDONDO.
- Por fim, teste seus resultados com seus usuários.
Esta postagem é útil? Se for para você, outros podem precisar também. Por favor, compartilhe este post em suas redes sociais favoritas.
Artigos relacionados
- Calculando o total de execução com a cláusula OVER e a cláusula PARTITION BY no SQL Server
- Calcule a mediana usando o Transact SQL