Voltar para a lista de artigos Artigos
11 minutos de leitura

Como usar o GROUP BY em SQL

Neste artigo, daremos a você um guia passo a passo sobre o uso de GROUP BY em SQL. Descubra as nuances do GROUP BY cláusula e aprender diferentes maneiras de utilizá-la.

GROUP BY é uma das cláusulas mais utilizadas em SQL. Ela o move de simplesmente selecionar dados do banco de dados para agrupar linhas com os mesmos valores de coluna em um único grupo. Quando usado com as funções agregadas do SQL, você pode usar GROUP BY para calcular métricas como a contagem do número de instâncias ou encontrar o valor total, médio, mínimo ou máximo.

GROUP BY é parte do conhecimento básico de SQL; você precisa se sentir realmente confortável com ele antes de passar a conceitos mais complicados.

Você já sabe que escrever código é melhor aprendido através da prática. Encontrar a oportunidade de escrever código SQL regularmente pode ser complicado se você não estiver trabalhando com SQL diariamente. Difícil, mas não impossível. O que torna isso possível é a Curso de Práticas em SQL curso. Os 88 exercícios oferecem muitas oportunidades para praticar GROUP BY e alguns outros conceitos SQL, tais como funções agregadas, JOINs e subconsultas.

Como o GROUP BY funciona? Um exemplo

Vou usar a tabela typewriter_products para demonstrar a importância da cláusula GROUP BY em SQL. Ela mostra coisas que você pode comprar de uma empresa fictícia que vende produtos relacionados à máquina de escrever. Para aqueles que podem se perguntar, esta é uma máquina de escrever:

Como usar o GROUP BY em SQL

Fonte: https://i.etsystatic.com/8429430/r/il/132716/1789166606/il_fullxfull.1789166606_1qnc.jpg

Quase como um computador sem tela. Quem sabe quantos livros importantes foram escritos usando uma máquina de escrever. Livros, lembra-se deles?

(Mas já chega de presunção! Fale sobre a mesa!)

Sim, a mesa. Ela tem as seguintes colunas:

  • id - A identificação do registro é única.
  • product_name - O nome do produto.
  • product_id - O ID do produto.
  • ribbon_brand - A marca da fita para máquina de escrever.
  • typewriter_brand - A marca da máquina de escrever para a qual a fita é feita.
  • ribbon_color - A cor da fita para máquina de escrever.
  • units - O número de unidades disponíveis do produto.
  • price - O preço do produto por unidade.

Os dados em si são mostrados abaixo.

idproduct_nameproduct_idribbon_brandtypewriter_brandribbon_colorunitsprice
1typewriter ribbon1All You NeedOlympiaBlack8810.00
2typewriter ribbon1All You NeedOlympiaBlack + Red4810.00
3typewriter ribbon2Ribbons & UsOlympiaBlack9712.39
4typewriter ribbon2Ribbons & UsOlympiaBlack + Red14715.15
5typewriter ribbon3All You NeedUnderwoodBlack1424.74
6typewriter ribbon3All You NeedUnderwoodBlack + Red1325.17
7typewriter ribbon4Our RibbonUnderwoodBlack5425.00
8typewriter ribbon5Ribbons & UsUnderwoodBlack15730.47
9typewriter ribbon5Ribbons & UsUnderwoodBlack + Red1428.47
10typewriter ribbon6All You NeedAdlerBlack4420.00
11typewriter ribbon6All You NeedAdlerBlack + Red1630.00
12typewriter ribbon7Ribbons & UsAdlerBlack5424.69
13typewriter ribbon7Ribbons & UsAdlerBlack + Red2730.30

Com esta tabela, você pode obter vários grupos. Por exemplo, você pode calcular o preço médio de um produto pela marca da máquina de escrever.

Aqui está a consulta que fará isso:

SELECT typewriter_brand,
 AVG(price) AS average_price
FROM typewriter_products
GROUP BY typewriter_brand;

Esta consulta agrupa os dados pela marca da máquina de escrever e calcula o preço médio. A consulta produzirá esta tabela:

typewriter_brandaverage_price
Adler26.25
Olympia11.89
Underwood26.77

A saída mostra três tipos de marcas de máquina de escrever e o preço médio do produto para cada máquina de escrever.

Ou você pode encontrar o número de fitas disponíveis por cor com esta consulta:

SELECT ribbon_color,
	 SUM(units) AS sum_units
FROM typewriter_products
GROUP BY ribbon_color;

O grupo nesta consulta é a cor das fitas. Também utilizo a função agregada SUM() para somar o número de unidades por cor de fita. Aqui está o resultado:

ribbon_colorsum_units
Black508
Black + Red265

Os dados são agrupados em duas linhas: fita preta e fita preta + fita vermelha. Para cada cor de fita, há um número de unidades disponíveis para venda.

Isto é uma prévia do que o GROUP BY faz e como funciona. Como você pode ver, a sintaxe do GROUP BY é relativamente simples. Se você precisar de mais esclarecimentos sobre a sintaxe do GROUP BY, dê uma olhada neste artigo.

Como você pode escrever suas próprias perguntas e fazer uso da cláusula GROUP BY? Aqui estão algumas dicas para ajudar você.

Passos para usar a cláusula GROUP BY

Como usar GROUP BY em SQL? Nesta seção, vou lhe dar uma receita passo a passo. Vamos imaginar que eu quero encontrar o número de registros para cada produto.

O primeiro passo para escrever uma consulta deve ser encontrar uma coluna de agrupamento adequada. Neste caso, é product_id. Colocamos esta coluna na cláusula GROUP BY:

SELECT
…
GROUP BY product_id;

O segundo passo é escolher a função agregada correta e utilizá-la na declaração SELECT. Como nosso objetivo é encontrar o número de registros, usamos a função COUNT(). Naturalmente, você também precisa especificar a coluna na cláusula FROM:

SELECT COUNT(*)
FROM typewriter_products
GROUP BY product_id;

Esta consulta será executada? Claro que sim! Ela retornará esta saída.

count
2
2
1
2
2
2
2

Como você pode ver, isto não é muito útil. Todos os produtos têm dois registros, exceto um, mas quais são estes produtos? Nós não temos nenhuma pista!

É por isso que o terceiro passo é importante. Nesta etapa, escreva também a coluna de agrupamento no site SELECT:

SELECT product_id,
	 COUNT(*)
FROM typewriter_products
GROUP BY product_id
ORDER BY product_id; 

Agora, a consulta mostrará esta saída.

product_idcount
12
22
32
41
52
62
72

Isto é muito mais útil, certo? Agora você sabe que o produto com ID 4 tem apenas uma ocorrência na tabela. Você provavelmente notou que eu usei COUNT(*) nas consultas acima. Esta não é a única maneira de usar essa função agregada. Você também pode aprender sobre todas as opções de uso de COUNT().

Ao comparar as duas consultas acima, você pode ver que é possível usar uma coluna no GROUP BY mas não usá-la em SELECT; o agrupamento ainda funciona.

E se você usou a coluna na declaração SELECT, mas não no GROUP BY? Não, você não pode fazer isso. A regra geral é: Se a coluna estiver no SELECT e não for utilizada em uma função agregada, ela deve ser listada na cláusula GROUP BY. Aqui estão mais alguns detalhes sobre esta regra.

Outras Dicas para usar GROUP BY em SQL

Embora o uso do GROUP BY pareça ser bastante fácil (e é!), há algumas outras dicas e truques que tornarão o seu uso uma experiência muito mais confortável.

Use um Identificador Único

Ao escolher por qual coluna agrupar, você deve geralmente usar a coluna que identifica de forma única o grupo. Se você não fizer isso, o resultado obtido pode ser enganoso ou simplesmente errado.

Por exemplo, vamos mostrar os produtos por marca de máquina de escrever, mas tente agrupar os dados pelo nome do produto. A consulta ...

SELECT product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_name, typewriter_brand
ORDER BY typewriter_brand;

... produzirá a seguinte tabela:

product_nametypewriter_brandproduct_count
typewriter ribbonAdler4
typewriter ribbonOlympia4
typewriter ribbonUnderwood5

Se você agrupasse os dados desta forma, ficaria com a impressão errada de que existe apenas um produto para cada uma das três marcas de máquinas de escrever - um produto que aparece quatro vezes para as máquinas de escrever Adler e Olympia e cinco vezes para Underwood.

E se você usasse a coluna product_id em vez do nome_do_produto?

SELECT product_id,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, typewriter_brand
ORDER BY typewriter_brand;

Agora você vê que o resultado é um pouco diferente:

product_idtypewriter_brandproduct_count
6Adler2
7Adler2
1Olympia2
2Olympia2
3Underwood2
4Underwood1
5Underwood2

Ainda existem produtos para três marcas de máquinas de escrever. Entretanto, agora você sabe que existem dois produtos para Adler e Olympia, ambos aparecendo duas vezes para cada máquina de escrever. Há três produtos para Underwood. Não só isso, mas você também sabe quais produtos eles são.

Vejamos este exemplo:

SELECT product_id,
	 product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, product_name, typewriter_brand
ORDER BY typewriter_brand;

Esta é uma versão ampliada da consulta anterior. Agrupamos novamente por product_id. Para obter o número de ocorrências de produtos, usamos a função COUNT(). Também queremos mais etiquetas, então adicionamos o nome do produto e a marca da máquina de escrever ao SELECT.

Como estas colunas aparecem no SELECT, elas também devem aparecer no GROUP BY. Note que todas as colunas o fazem, exceto a que tem a função agregada.

Dê uma olhada na saída:

product_idproduct_nametypewriter_brandproduct_count
6typewriter ribbonAdler2
7typewriter ribbonAdler2
1typewriter ribbonOlympia2
2typewriter ribbonOlympia2
3typewriter ribbonUnderwood2
4typewriter ribbonUnderwood1
5typewriter ribbonUnderwood2

Você pode ver a saída que dá a imagem mais clara. Existem sete produtos diferentes, mas são todos fitas para máquinas de escrever. Estes produtos são para três marcas de máquinas de escrever. Todos os produtos têm duas ocorrências, exceto o produto nº 4.

Agrupamento por valor

Nem sempre é necessário agrupar pela coluna de identificação. Também é possível agrupar os dados por valor.

Por exemplo, se você quisesse saber quantas unidades existem pela cor da fita, você usaria esta consulta:

SELECT ribbon_color,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color;

Aqui utilizamos a cor da fita como critério de agrupamento. A função agregada SUM() totalizará as unidades da seguinte forma:

ribbon_colorunits_sum
Black508
Black + Red265

A saída mostra que existem 508 fitas pretas e 265 fitas pretas e vermelhas.

Se você não estiver familiarizado com a soma dos valores, verifique a função SUM() explicada. As funções MIN() & MAX() também são comumente usadas com GROUP BY.

Duas Colunas como o Definidor do Grupo

A cláusula GROUP BY permite agrupar os dados por duas ou mais colunas; você já viu isso. Mas também é possível usar duas colunas como o identificador único de um grupo. Por exemplo, a cláusula GROUP BY:

SELECT ribbon_color,
	 typewriter_brand,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color, typewriter_brand
ORDER BY typewriter_brand;

Nesta consulta, utilizamos as colunas ribbon_color e typewriter_brand para definir um grupo. Cada cor de fita para uma máquina de escrever específica será mostrada apenas uma vez. Para tal grupo definido, calculamos o número de fitas disponíveis:

ribbon_colortypewriter_brandunits_sum
BlackAdler98
Black + RedAdler43
BlackOlympia185
Black + RedOlympia195
BlackUnderwood225
Black + RedUnderwood27

Agrupamento por uma Expressão

Em vez de agrupar apenas por colunas, também é possível agrupar os dados por uma expressão.

Vamos dar uma olhada na seguinte consulta:

SELECT ribbon_brand,
	 ribbon_color,
	 units*price AS product_value,
 SUM(units*price) AS product_value_sum
FROM typewriter_products
GROUP BY ribbon_brand, ribbon_color, units*price
ORDER BY ribbon_brand;

Aqui selecionamos a marca e a cor da fita. Além disso, também calculamos o valor de cada grupo multiplicando a unidade pelo preço.

Em seguida, agrupamos os dados pelas colunas ribbon_brand e ribbon_color. Isto é algo a que você está acostumado. Mas também adicionamos a fórmula para calcular o valor à cláusula GROUP BY. Queremos mostrar apenas valores únicos por marca e cor da fita. Se houver vários dos mesmos valores calculados dentro de um mesmo grupo, eles serão mostrados como uma linha.

Para tornar a agregação mais óbvia, acrescentei a soma dos valores do produto. Logo você verá o porquê.

ribbon_brandribbon_colorproduct_valueproduct_value_sum
All You NeedBlack346.36346.36
All You NeedBlack880.001,760.00
All You NeedBlack + Red327.21327.21
All You NeedBlack + Red480.00960.00
Our RibbonBlack1,350.001,350.00
Ribbons & UsBlack1,201.831,201.83
Ribbons & UsBlack1,333.261,333.26
Ribbons & UsBlack4,783.794,783.79
Ribbons & UsBlack + Red398.58398.58
Ribbons & UsBlack + Red818.10818.10
Ribbons & UsBlack + Red2,227.052,227.05

Pode parecer que esta tabela não está agrupada de forma alguma. Mas vamos dar uma olhada mais de perto. Se os dados não estivessem agrupados, a marca All You Need teria aparecido seis vezes, o mesmo que Ribbons & Us. Mas aparece apenas quatro vezes. Por quê? Porque os valores 880,00 e 480,00 aparecem duas vezes cada um, então eles estão agrupados.

Isto é o que a coluna valor_do_produto_sum lhe diz nas filas coloridas. Estas são as únicas linhas em que esta coluna é diferente do valor_do_produto. A linha verde tem uma soma de 1.760,00 porque o valor 880,00 aparece duas vezes. A linha vermelha tem uma soma de 960,00 porque o valor 480,00 aparece duas vezes.

Passos para escrever uma consulta com funções de GROUP BY e agregar

Você já internalizou GROUP BY através da escrita de todas as perguntas acima. Mas acho que vale a pena ter isto como uma lista separada - a lista de verificação dos passos.

  • Etapa 1: Identifique a(s) coluna(s) de agrupamento, ou seja, uma coluna ou colunas pelas quais você deseja agrupar os dados. Depois de identificá-la, coloque-a na cláusula GROUP BY.
  • Etapa 2: Dependendo da métrica que você deseja calcular, escolha a função agregada apropriada e use-a na declaração SELECT.
  • Etapa 3: Utilize a coluna de agrupamento na instrução SELECT. Dessa forma, você obterá etiquetas de dados para cada grupo, não apenas a saída da função agregada.

Nenhum usuário SQL pode evitar o uso de GROUP BY

Nenhum usuário SQL conhecido por mim conseguiu viver uma vida SQL de sucesso e escrever consultas sem o GROUP BY. É impossível! Então, por que não praticar GROUP BY e outras expressões e funções SQL? A escolha sábia seria nossa Curso de Práticas em SQL. Ele lhe oferece a oportunidade de praticar todas as diferentes formas de utilização do GROUP BY abordadas no artigo.

Alguns outros recursos úteis para exemplos do GROUP BY estão disponíveis em nosso blog; o conceito também aparece freqüentemente em perguntas de entrevistas de emprego SQL.