Voltar para a lista de artigos Artigos
13 minutos de leitura

Como usar SUM() com GROUP BY: Um guia detalhado com 8 exemplos

Explore alguns exemplos reais de uso de SUM() e GROUP BY em SQL, desde o mais básico até o mais sofisticado.

SUM() SUM() é uma função de agregação SQL que calcula a soma dos valores fornecidos. GROUP BY é uma cláusula SQL que divide as linhas em grupos e calcula uma função de agregação declarada para cada grupo. Usando essas duas funções juntas, você pode calcular as somas totais de um grupo de linhas.

Neste artigo, veremos 8 exemplos diferentes de como você pode combinar SUM() e GROUP BY para criar muitos relatórios diferentes. Falaremos sobre o caso de uso mais básico e abordaremos alguns cenários complexos.

A melhor maneira de atualizar suas habilidades em SQL - incluindo SUM() e GROUP BY - é nossa ferramenta interativa Curso de Práticas em SQL. Ele contém 88 exercícios interativos que abordam diferentes tópicos de SQL. O curso é perfeito para a preparação para entrevistas ou para uma revisão antes de um exame de SQL.

Exemplo 1: Uso básico de SUM() e GROUP BY em SQL

Vamos dar uma olhada em um exemplo de como a função SUM() funciona junto com GROUP BY:

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

A consulta retorna uma lista de todos os países encontrados na tabela orders juntamente com uma soma total das quantidades de pedidos para cada país. As linhas da tabela orders são divididas em grupos (um grupo para cada país) e o banco de dados soma os valores de quantidade para cada país.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

Uma análise detalhada do Exemplo 1

Vamos analisar esse exemplo em detalhes.

Aqui estão os dados na tabela orders tabela. Essa tabela seria comum em um sistema de comércio eletrônico; além do país de destino das mercadorias e da quantidade pedida, ela inclui dados sobre o vendedor que recebeu o pedido, a SKU do produto, a data do pedido e o endereço do cliente.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand

A tabela de pedidos que usaremos ao longo deste artigo.

A função SUM() no SQL

A função SUM() é uma das funções de agregação do SQL. As funções agregadas no SQL retornam um único valor para um conjunto de linhas. A função SUM() retorna a soma dos argumentos fornecidos à função. Há outras funções de agregação do SQL, mas neste artigo vamos nos concentrar apenas em SUM().

Quando adicionamos SUM() à consulta ...

SELECT SUM(quantity)
FROM orders;

... obteremos apenas um único valor, resultante da soma de todos os valores de quantidade:

SUM(quantity)
122

Observe que a função SUM() ignora os valores NULL. Eles são tratados como 0s no cálculo. Para obter mais informações sobre a função SUM(), você pode ler esta explicação completa da função SQL SUM().

A função SUM(), como outras funções de agregação, é normalmente usada com a cláusula GROUP BY.

A cláusula GROUP BY no SQL

A cláusula GROUP BY é usada para calcular estatísticas de um grupo de linhas; as linhas são divididas em grupos com base nos valores de uma ou mais colunas. A instrução SELECT com GROUP BY retorna uma única linha para cada grupo distinto definido na cláusula GROUP BY.

Vamos voltar à nossa consulta de exemplo:

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

As linhas da tabela orders são particionadas em grupos com base no valor da coluna country devido a esta linha: GROUP BY country. Ela diz ao banco de dados para colocar as linhas com o mesmo valor country em um único grupo.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States

As linhas do México são colocadas em um grupo, as linhas da Nova Zelândia em outro grupo e assim por diante. A função SUM() é então aplicada aos valores de quantidade em cada grupo. A soma para os Estados Unidos é a soma de 10, 12 e 15, resultando em 37. A soma para o Reino Unido é a soma de 18 e 25, resultando em 43, etc.

Aqui está o resultado de nossa consulta novamente. Você pode ver que cada linha contém a soma dos valores de quantidade no grupo correspondente.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

A cláusula GROUP BY é especialmente útil quando você deseja obter informações resumidas de tabelas com muitas linhas para analisá-las uma a uma. Para obter mais informações, leia uma explicação completa da cláusula SQL GROUP BY ou este artigo que explica GROUP BY em SQL.

Exemplo 2: Cálculo de 2 SUMs e agrupamento por 2 colunas

No exemplo anterior, vimos como usar SUM() e GROUP BY para agrupar um conjunto de dados pela coluna country e obter a quantidade total de cada país separadamente. Você também pode agrupar por mais de uma coluna com GROUP BY e calcular mais de uma soma em uma consulta.

Se quisermos conhecer todas as combinações de country e salesperson na tabela e obter o total de quantidades pedidas e seus valores para cada combinação, precisaremos usar SUM() e GROUP BY.

Aqui está a consulta:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Com base na tabela acima, essa consulta resulta nos seguintes dados:

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Temos duas expressões que usam a função SUM() na consulta: uma calcula a quantidade total e a outra calcula o valor total. Também agrupamos por duas colunas: country e salesperson.

Internamente, o mecanismo de banco de dados executa o seguinte procedimento:

  1. Ele cria um conjunto de resultados a partir da tabela especificada na cláusula FROM, agrupando as linhas para cada combinação de valores das colunas especificadas na cláusula GROUP BY. Em nosso exemplo, as linhas com o mesmo valor de country e salesperson são agrupadas: há uma linha para as vendas da Meghan nos EUA, uma linha para as vendas do Stephen nos Estados Unidos etc.
  2. Para cada linha do conjunto de resultados criado na etapa anterior, ele calcula a soma de cada coluna dentro de um SUM(). Em nosso exemplo, ele calcula a soma das colunas quantity e a soma das colunas amount.
  3. Ele retorna o conjunto de resultados com as somas.

Se necessário, você pode agrupar por mais de duas colunas. Você pode ler sobre o agrupamento por várias colunas em nosso artigo Como Agrupar por Múltiplas Colunas em SQL.

Exemplo 3: Uso de uma condição WHERE com SUM e GROUP BY

Você pode usar uma condição WHERE em sua consulta com SUM() e GROUP BY. Nesse caso, o mecanismo de banco de dados altera o procedimento visto acima para retornar os resultados da consulta. Ele aplica a cláusula WHERE na etapa 1 do procedimento. Em seguida, o conjunto de resultados inicial será montado a partir das linhas que atendem à condição WHERE.

As colunas envolvidas na condição WHERE podem ser qualquer uma das colunas da tabela. Não importa se elas estão ou não listadas na cláusula GROUP BY ou se são ou não retornadas como resultado da consulta.

Seguindo nosso exemplo, poderíamos usar qualquer uma das colunas da tabela ordersproduct_sku order_date Estamos interessados nos pedidos do produto com o SKU 990048006427 que foram feitos entre 7 de abril de 2023 e 8 de abril de 2023.

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE 
  product_sku = '990048006427' 
  AND order_date BETWEEN '2023-04-07' AND '2023-04-08'
GROUP BY country, salesperson;

Para resolver essa consulta, o mecanismo de banco de dados criará primeiro um conjunto de resultados temporários da tabela orders que atenda às condições da cláusula WHERE. A partir desse conjunto de resultados, ele pegará todas as combinações das colunas country e salesperson. Para cada combinação, ele calculará as somas de quantity e amount.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
MexicoMeghan12912.45

Observe que, quando comparamos o resultado com o Exemplo 2, incluímos somente os pedidos feitos entre 7 de abril de 2023 e 8 de abril de 2023 para o produto 990048006427. Por exemplo, não há linhas para as vendas da Meghan nos Estados Unidos, pois ela não vendeu esse produto nesses dois dias de abril.

Exemplo 4: uso da cláusula ORDER BY com SUM e GROUP BY

Se também adicionarmos uma cláusula ORDER BY à consulta que criamos com SUM() e GROUP BY, o mecanismo de banco de dados terá que fazer um pouco mais de trabalho. Ele adiciona mais uma etapa às três descritas acima; essa etapa consiste em classificar os resultados de acordo com os critérios especificados na cláusula ORDER BY.

Por exemplo, poderíamos classificar os resultados pela soma de amount, referenciando-o por seu alias amntTotal. Também poderíamos especificar a expressão completa SUM(amount):

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal, 
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson
ORDER BY amntTotal DESC;

Neste exemplo, adicionamos a cláusula DESC para que os resultados sejam classificados do maior para o menor.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
United KingdomStephen181012.66
United StatesArthur15914.42
MexicoMeghan12912.45
United StatesMeghan10845.25
New ZealandArthur16842.06
New ZealandStephen14799.45
United StatesStephen12705.5
MexicoArthurNULLNULL

Exemplo 5: Expressões de soma

Além de ser aplicada a colunas individuais, a função SUM também pode ser aplicada a expressões que retornam valores numéricos. Suponha que tenhamos uma coluna unit_price em vez de uma coluna de valor. O valor do pedido resultaria da multiplicação de quantity por unit_price.

Para que o SQL SUM GROUP BY retorne uma soma dos valores pedidos nesse caso, teremos de aplicar a função SUM() na expressão quantity * unit_price:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(quantity * unit_price) AS amntTotal
FROM orders
GROUP BY country, salesperson;

O resultado da consulta seria o mesmo do Exemplo 2:

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

O procedimento realizado pelo mecanismo de banco de dados seria um pouco diferente. Para cada grupo, ele primeiro computaria o valor da expressão quantity * unit_price e, em seguida, calcularia as somas usando os valores computados.

Exemplo 6: Valores nulos na função SUM()

Ao usar a função SUM() no SQL, NULLs é ignorado e não é incluído no cálculo do total. Se alguma linha da tabela orders tiver valores NULL nas colunas quantity ou amount, eles serão ignorados pela função SUM(). A exceção é se todos os valores forem NULL para qualquer uma das colunas, caso em que a função SUM() também retornará NULL.

Essa ressalva afeta a combinação SUM() e GROUP BY. Se houver algumas combinações dos valores das colunas GROUP BY em que todos os valores totalizados sejam NULL, então SUM() também retornará NULL para essa combinação de valores.

Em nossa tabela de pedidos de amostra, todas as linhas de country='Mexico' e salesperson='Arthur' têm um valor NULL na quantidade e no valor. Por esse motivo, o resultado de SUM() e GROUP BY retorna NULL na soma da quantidade e do valor para country = 'Mexico' e salesperson = 'Arthur'. Entretanto, nem Arthur nem México são NULL em nenhuma de suas outras combinações.

Dê uma olhada:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE country = 'Mexico' AND Salesperson = 'Arthur'
GROUP BY country, salesperson;
countrysalespersonqtyTotalamntTotal
MexicoArthurNULLNULL

Se uma nova linha fosse inserida para country = 'Mexico' e salesperson = 'Arthur' com valores que não fossemNULL em quantity e amount, o restante dos valores de NULL seria ignorado no total. Os resultados de SUM() incluiriam apenas os valores que não têm NULLs nas colunas que estão sendo somadas.

Exemplo 7: conversão de valores NULL em zeros

Vimos que a função SUM() retorna NULL se todos os valores da coluna somada forem NULL. Se houver apenas um valor nãoNULL, os demais valores NULL serão ignorados, ou seja, serão tratados como se fossem zero.

Isso pode ser difícil de explicar ao contar histórias sobre dados. Queremos evitar que a palavra "NULL" apareça em uma caixa de resultado onde deveria aparecer um número (causando assim confusão ao nosso público). Nesses casos, é conveniente converter os valores de NULL em zeros. Para fazer isso, você pode usar a função COALESCE. Ela converte os valores de NULL em uma coluna em um valor definido - geralmente zero, embora outros valores possam ser usados.

Em nosso exemplo, não queremos correr o risco de que os valores de NULL em quantity ou amount façam com que o texto "NULL" apareça em nossos resultados. Podemos incluir essas colunas na função COALESCE e enviar o resultado como parâmetro da função SUM():

SELECT 
  country, 
  salesperson, 
  SUM(COALESCE(quantity, 0)) AS qtyTotal,
  SUM(COALESCE(amount, 0)) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Dessa forma, todos os NULLs nas colunas somadas aparecerão como zeros.

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthur00.00
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Observe que a linha das vendas de Arthur no México agora mostra 0 em vez de NULL.

Exemplo 8: SUM() com condicionais

Às vezes, queremos que a combinação GROUP BY SUM() considere apenas os dados que atendem a determinadas condições.

Continuando com nosso exemplo, suponha que cada pedido tenha uma coluna do tipo BIT chamada delivered que indica se o pedido foi entregue ou não. Talvez queiramos que os resultados de nossas somas sejam divididos em dois: um total de produtos entregues e um total de produtos não entregues. Isso é resolvido com o uso de CASE WHEN dentro da função SUM() para avaliar o conteúdo da coluna delivered:

SELECT 
  country,
  SUM(CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END) AS qtyTotalDelivered,
  SUM(CASE 
    WHEN delivered = 0 THEN quantity 
    ELSE 0 END) AS qtyTotalNotDelivered
FROM orders
GROUP BY country;

A instrução CASE WHEN é semelhante à instrução IF em muitas linguagens de programação; ela acrescenta alguma lógica ao fluxo da nossa consulta avaliando uma condição declarada. Ela fornece a condição após WHEN. Se a condição for atendida, o valor após THEN será retornado. Se a condição não for atendida, o valor após ELSE será retornado.

CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END

Nessa expressão, retornamos a coluna quantity para produtos entregues. Para outros produtos, retornamos 0.

Aqui está o resultado da consulta:

countryqtyTotalDeliveredqtyTotalNotDelivered
United States2215
United Kingdom1825
Mexico12NULL
New Zealand1416

Você pode ler mais sobre como usar CASE WHEN com SUM e GROUP BY em outra parte do nosso blog.

Pratique o uso de SUM() com GROUP BY em suas consultas SQL

Ao longo deste artigo, vimos oito exemplos de como combinar SUM() e GROUP BY em consultas SQL. Nossa tabela orders embora tenha apenas algumas linhas, representa situações da vida real.

Em seu trabalho, você frequentemente encontrará situações semelhantes às que apresentamos, mas suas tabelas serão preenchidas com muito mais linhas. Você terá que usar todas as variantes possíveis de SUM() e GROUP BY para provar que os resultados de suas consultas são legítimos.

Aproveite nosso Curso de Práticas em SQL curso e Trilha de Práticas em SQL para aprimorar suas habilidades em SQL. Lembre-se: O aspecto mais importante do trabalho de um analista de dados é que as informações que ele fornece sejam 100% confiáveis.