Voltar para a lista de artigos Artigos
8 minutos de leitura

Como usar a função ROUND() em SQL

Precisa arredondar os resultados numéricos em SQL? A função ROUND() está aqui para fazer o trabalho.

Os bancos de dados relacionais modernos oferecem muitas funções incorporadas que ampliam as capacidades do SQL. Neste artigo, usaremos exemplos práticos para explicar como a função ROUND() funciona. (Alerta Spoiler: Se você adivinhou que ele arredonda um número para uma certa casa decimal, você está certo! Continue lendo para saber mais).

Funções padrão SQL

Cada banco de dados SQL (PostgreSQL, MySQL, Oracle, SQL Server entre outros) tem um conjunto de funções integradas. Para entender o que isto significa, vamos falar de funções.

Uma função é uma peça de código predefinida que transforma seus argumentos em resultado. Por exemplo, a função SUBSTRING() recebe uma cadeia de caracteres (isto é, uma palavra, frase, etc.) como argumento e retorna parte desta cadeia. Outras funções como MAX() (que retorna o maior valor) e MIN() (que retorna o menor valor) processam dados numéricos; você pode saber mais sobre estas funções no artigo O que são as funções SQL MIN() e MAX()?

Uma função pode ser chamada em uma consulta SQL sempre que você precisar fornecer um valor. Você pode chamar uma função na lista de colunas SELECT, na condição WHERE, ou em qualquer outro lugar da consulta onde um valor deve ser fornecido. Há muitas funções em SQL, e cada banco de dados SQL fornece um conjunto diferente de funções.

Se você está procurando por um curso abrangente sobre funções em SQL, confira nosso curso interativo sobre Funções Comuns em SQL. Ele cobre tanto funções SQL básicas quanto avançadas, equipando-o com tudo o que você precisa para começar a usá-las para processar dados numéricos, textos e outros tipos de dados em bancos de dados SQL.

Qual é a função SQL ROUND()?

A função ROUND em SQL é usada para arredondar um determinado número para o inteiro mais próximo ou para uma certa casa decimal. Mostraremos vários exemplos de consultas usando a função ROUND(), mas primeiro introduziremos uma tabela de exemplo SQL chamada sales. Esta tabela registra os dados de vendas para um pequeno mercado. Alguns dos produtos (como ovos ou vegetais) são vendidos com base no peso; neste caso, a coluna quantity registra o número de quilos vendidos, que pode incluir dígitos decimais.

dateselleritemQuantity (in units or kilos)unit_pricetotal
2021-12-06CharlesSoda Bbg 500Ml23.236.46
2021-12-06CharlesIce Cream 10Oz22.765.52
2021-12-06CharlesEgg Pack HpyHen1.20.750.9375
2021-12-06CharlesBanana Ecuador1.872.544.7498
2021-12-07CharlesShampoo A10040.993.96
2021-12-07CharlesBatteries A3101.5315.30
2021-12-07MaryCandy Pack B2012.152.15
2021-12-07MaryBanana Ecuador1.472.543.7338
2021-12-07MaryIce Cream 10Oz12.762.76
2021-12-07MarySoda Bbg 500Ml13.233.23
2021-12-08CharlesEgg Pack HpyHen1.430.751.0725

Vamos começar mostrando uma consulta simples usando a função ROUND() em SQL Standard. Se olharmos para a coluna total no sales tabela acima, podemos ver alguns registros onde o valor tem 3 dígitos decimais. Suponha que queremos um relatório mostrando todas as vendas, mas queremos apenas um máximo de 2 dígitos decimais na coluna total. Esta é a consulta que usaríamos:

SELECT 
  date, 
  seller, 
  item, 
  quantity, 
  unit_price, 
  ROUND(total, 2) AS total
FROM sales

Podemos ver que a função ROUND() recebe dois parâmetros. O primeiro é o valor numérico a ser arredondado (ou seja, a coluna total ); o segundo é chamado precision e indica o número de dígitos decimais que queremos manter no número arredondado. O resultado desta consulta é mostrado abaixo:

dateselleritemquantityunit_pricetotal
2021-12-06CharlesSoda Bbg 500Ml23.236.46
2021-12-06CharlesIce Cream 10Oz22.765.52
2021-12-06CharlesEgg Pack HpyHen1.20.750.94
2021-12-06CharlesBanana Ecuador1.872.544.75
2021-12-07CharlesShampoo A10040.993.96
2021-12-07CharlesBatteries A3101.5315.30
2021-12-07MaryCandy Pack B2012.152.15
2021-12-07MaryBanana Ecuador1.472.543.73
2021-12-07MaryIce Cream 10Oz12.762.76
2021-12-07MarySoda Bbg 500Ml13.233.23
2021-12-08CharlesEgg Pack HpyHen1.430.751.07

Na coluna total acima, podemos ver o resultado da função ROUND(). Note que todos os valores de total têm dois dígitos decimais. O valor foi arredondado para o centésimo mais próximo, o que significa que a transformação ROUND() não é uma simples truncagem. Por exemplo 4.7498 foi arredondado para 4,75 que é um valor superior; 3.7338 foi arredondado para 3.73, que é um valor inferior.

Como regra geral, números com 5 ou mais na casa decimal especificada são arredondados para cima (4,7498 é arredondado para cima e 4,75) e números abaixo de 5 são arredondados para baixo (3,7338 é arredondado para baixo e 3,73).

Usando a função ROUND() com um argumento

A função ROUND() que utilizamos no exemplo anterior tinha dois argumentos: o valor a arredondar, e o precision (que era 2). O precision indica o número de casas decimais que queremos no resultado. Entretanto, pode-se omitir o parâmetro precision, em cujo caso ROUND() assume uma precisão padrão de 0 e retorna valores inteiros com 0 casas decimais.

Vamos ver um exemplo. Suponhamos que queremos obter a receita total de nosso mercado agrupada pelo vendedor. Entretanto, queremos um relatório compacto e simples, com os valores de receita como números inteiros. Este é o código que usaríamos em um banco de dados MySQL:

SELECT
  seller, 
  ROUND(SUM(total)) as total_revenue
FROM sales
GROUP BY seller

Podemos ver os resultados abaixo.

sellertotal_revenue
Charles12
Mary38

Usando a função SQL ROUND() em diferentes bancos de dados

No próximo exemplo, queremos mostrar o resultado da função ROUND() em alguns valores específicos, como valores que terminam em 0,5 ou 0,0. Para este fim, mostraremos uma consulta que demonstra como funciona o arredondamento:

SELECT 1.20 as Value, ROUND(1.20,1) AS "Round(value,1)" 
UNION
SELECT 1.22 as Value, ROUND(1.22,1) AS "Round(value,1)" 
UNION
SELECT 1.25 as Value, ROUND(1.25,1) AS "Round(value,1)" 
UNION
SELECT 1.27 as Value, ROUND(1.27,1) AS "Round(value,1)" 

As consultas anteriores utilizam apenas constantes (ou seja, valores explicitamente definidos) em vez de dados de uma tabela. É por isso que não há uma cláusula FROM na consulta. Os resultados são:

ValueRound(value,1)
1.201.2
1.221.2
1.251.3
1.271.3

Quanto aos resultados da função ROUND(), podemos concluir que para valores na faixa 1.20 a 1.249999, o resultado do ROUND() é 1.2, porém para valores na faixa 1.25 a 1.299999 o resultado é 1.3. Talvez o ponto mais importante aqui é que 1.25 é arredondado para 1.3.

A função ROUND() no Oracle é semelhante à função ROUND() em outros bancos de dados. Entretanto, para o tipo de dados BINARY_FLOAT, Oracle implementa uma variação no algoritmo de arredondamento chamado rounding half to even. Este arredonda números com uma parte fracionária de 0,5 para o número inteiro par mais próximo. Assim, ROUND(23.5) retorna 24 e ROUND(24.5) retorna 24 também. Como mencionamos anteriormente, este comportamento da função ROUND() é apenas para o tipo de dados BINARY_FLOAT; para outros tipos de dados numéricos, ROUND(24.5) retorna 25. Podemos ver isto no seguinte exemplo de consulta executada em Oracle.

SELECT	
  binary_float_value,
  ROUND(binary_float_value), 
  numeric_value,
  ROUND(numeric_value) 
FROM test_round_with_float;

Nos resultados, podemos ver a diferença entre os dois tipos de dados. ROUND(24.5) retorna 24 quando o tipo de dados do argumento é BINARY_FLOAT; retorna 25 quando o tipo de dados é qualquer outro tipo de dados numéricos (como NUMERO).

BINARY_FLOAT_VALUEROUND(BINARY_FLOAT_VALUE)NUMERIC_VALUEROUND(NUMERIC_VALUE)
23.52423.524
24.52424.525

Usando SQL ROUND() com Precisão Negativa

ROUND() oferece uma funcionalidade diferente quando o parâmetro de precisão é um número negativo. No exemplo abaixo, podemos obter o múltiplo mais próximo de 100, utilizando ROUND(value, -2). Utilizaremos uma consulta semelhante à anterior para mostrar esta funcionalidade:

SELECT 12345 as Value, ROUND(12345,-2) AS "Round(value,-2)" 
UNION
SELECT 12355 as Value, ROUND(12355,-2) AS "Round(value,-2)" 
UNION
SELECT 12350 as Value, ROUND(12350,-2) AS "Round(value,-2)" 
UNION
SELECT 101 as Value, ROUND(101,-2) AS "Round(value,-2)" 
UNION
SELECT 199 as Value, ROUND(199,-2) AS "Round(value,-2)" 
UNION
SELECT 99 as Value, ROUND(99,-2) AS "Round(value,-2)" 

A consulta atual é executada no MS SQL Server. Como a consulta anterior, continuamos usando dados constantes para mostrar como ROUND() funciona. Você pode ver como um parâmetro precision de -2 funciona em valores diferentes. O resultado de ROUND(value, -2) é o múltiplo mais próximo de 100 ao value. Podemos ver no resultado da consulta abaixo:

ValueRound(value, -2)
1234512300
1235512400
1235012400
101100
199200
99100

Usando ROUND() em WHERE

No exemplo a seguir, mostraremos como utilizar a função SQL ROUND() na cláusula WHERE de uma consulta. Suponha que queremos um relatório mostrando todos os itens com um preço com a parte decimal inferior a 50 centavos. A condição a seguir identificará esses preços:

ROUND(unit_price) < unit_price

A idéia por trás da condição anterior é a seguinte. Quando a parte decimal na coluna unit_price for inferior a 0,50, a função ROUND(unit_price) retornará um valor inferior ( se o preço for 3.23 então, ROUND(3.23) retorna 3.00, que é inferior a 3,23). Então, toda a consulta SQL é:

SELECT 
  distinct item, 
  unit_price,
  unit_price - ROUND(unit_price) AS decimal_part
FROM sales
WHERE ROUND(unit_price) < unit_price

Também adicionamos um campo extra chamado decimal_part na lista SELECT para mostrar como calcular a parte decimal de um número usando a função ROUND(). A consulta anterior foi executada em um banco de dados PostgreSQL; podemos ver os resultados abaixo:

itemunit_pricedecimal_part
Candy Pack B202.150.15
Soda Bbg 500Ml3.230.23

Se você quiser mais informações sobre a função SUM(), sugiro a leitura do artigo SQL SUM() Função Explicada com 5 Exemplos Práticos.

Use as funções SQL para alimentar suas consultas

Neste artigo, explicamos a função ROUND() em SQL usando exemplos de diferentes bancos de dados. Não importa qual banco de dados você prefira, agora você sabe como ROUND() funciona e como pode utilizá-lo em suas consultas e relatórios.

Antes de terminar, eu tenho outra recomendação para você. Nossa Folha de Consulta Funções Comuns em SQL gratuita permite que você encontre rapidamente detalhes sobre as funções embutidas do SQL, funções agregadas e muito mais. Eu a uso quase todos os dias quando trabalho com SQL. E não se esqueça da nossa Funções Comuns em SQL onde você pode aprender e praticar funções numéricas, de texto e de data. Aumente suas habilidades, aumente seu patrimônio!