Voltar para a lista de artigos Artigos
10 minutos de leitura

Como usar COUNT() com GROUP BY: 5 exemplos práticos

Usar a função COUNT() com GROUP BY é uma das construções SQL mais comuns em consultas agregadas. Leia este artigo para saber como usar COUNT() com GROUP BY corretamente usando 5 exemplos.

Neste artigo, explicaremos a importância de usar COUNT com GROUP BY. Falaremos sobre por que ele é essencial no SQL e como ele permite a análise e o resumo de dados com base em critérios específicos. Essa combinação permite que os usuários extraiam insights significativos, calculem contagens e gerem resumos estatísticos de grandes conjuntos de dados.

Se você estiver procurando uma revisão detalhada dos conceitos básicos de SQL, como COUNT() e GROUP BY, recomendo nosso SQL para Iniciantes curso interativo. Ele contém 129 exercícios que o ajudarão a revisar todos os principais conceitos de SQL.

Como usar COUNT() e GROUP BY

Se você está aqui apenas para obter uma resposta rápida, aqui está o TLDR:

A maneira correta de usar COUNT() com GROUP BY é mostrada na consulta abaixo:

SELECT 
  Store,
  COUNT(*) as NumberOfSales, 
FROM Sales
GROUP BY Store;

Vamos decompor o resultado para entender como essa consulta funciona. As linhas com o mesmo valor na coluna Store são agrupadas. Imagine uma tabela intermediária em que essas linhas são agrupadas e marcadas com cores diferentes, como na imagem abaixo. Essa seria a nossa tabela intermediária contendo somente a coluna Store, já que essa é a coluna que faz parte do nosso comando SELECT.

StoreProductIDCustomerID
Store A1657
Store A11116
Store A14525
Store B1369
Store B11138
Store C13616
Store C1118

Em seguida, o banco de dados conta logicamente o número de linhas em cada grupo usando a função COUNT(*). Essa contagem representa o número de pedidos de cada loja.

Depois que as linhas são contadas, não há necessidade de ter linhas duplicadas com o mesmo valor de Store. Portanto, GROUP BY reduzirá o número de linhas para apenas valores exclusivos. Em outras palavras, ele se livrará das linhas individuais e nos fornecerá um resumo de cada grupo. O resultado final é o seguinte:

StoreNumberOfSales
Store A3
Store B2
Store C2

Quando usar GROUP BY

GROUP BY é uma cláusula SQL que agrupa linhas com base em um ou mais valores de coluna. Ela é frequentemente usada em combinação com funções agregadas como COUNT(), SUM(), AVG(), MAX() e MIN() para realizar cálculos em dados agrupados.

A cláusula GROUP BY é útil quando você deseja:

  • Fazer cálculos e agregações em subconjuntos de dados.
  • Gerar estatísticas resumidas e métricas para diferentes grupos ou categorias.
  • Identificar padrões e tendências em grupos específicos.
  • Gerar relatórios e analisar dados com base em diferentes dimensões ou atributos.
  • Aplicar filtros e condições em dados agrupados, usando a função HAVING

Em resumo, GROUP BY é usado para organizar e resumir dados com base em colunas, funções ou expressões específicas, o que lhe permitirá obter insights e realizar cálculos em grupos distintos dentro de um conjunto de dados.

Quando usar a função COUNT()

COUNT() é uma das funções de agregação mais comuns do SQL. Ela retorna o número de linhas que correspondem a uma condição especificada ou que estão incluídas em um conjunto de resultados. É frequentemente usada para recuperar o número total de registros em uma tabela ou para calcular o número de ocorrências de um determinado valor em uma coluna.

5 exemplos de uso de COUNT() com GROUP BY

Agora que já examinamos os cenários básicos em que COUNT() e GROUP BY são usados, vamos examinar alguns dos exemplos mais complicados. Começaremos com os exemplos mais simples e iremos nos aprofundando nos cenários mais complexos.

Exemplo nº 1: GROUP BY em uma única coluna

O cenário mais simples que você pode encontrar é quando precisa agrupar por uma única coluna. No exemplo a seguir, precisamos descobrir como o número de funcionários da nossa empresa está distribuído entre diferentes cargos.

Antes de ver a solução SQL para esse cenário, vamos examinar os dados de amostra. Esta é a tabela employees tabela:

EmployeeIDFirstNameLastNameJobTitle
1JohnDoeManager
2JaneSmithSupervisor
3MarkJohnsonDeveloper
4EmilyWilliamsAnalyst
5MichaelBrownDesigner
6SarahDavisDeveloper
7RobertWilsonDesigner
8JessicaTaylorDeveloper

Ao usar a função COUNT com GROUP BY na coluna JobTitle, podemos obter um detalhamento do número de funcionários em cada função específica. Você pode ver a consulta e o resultado (com base nos dados de amostra) abaixo:

SELECT 
  JobTitle, 
  COUNT(*) AS NumberOfEmployees
FROM employees
GROUP BY JobTitle;
JobTitleNumberOfEmployees
Analyst1
Designer2
Developer3
Manager1
Supervisor1

Esse exemplo funciona da mesma forma que nossa consulta inicial. GROUP BY coloca as linhas dos funcionários com o mesmo cargo em um grupo. Em seguida, a função COUNT() conta as linhas em cada grupo. Em seguida, GROUP BY comprime as linhas em cada grupo, mantendo apenas o valor da coluna JobTitle e a contagem.

Exemplo nº 2: GROUP BY Multiple Columns (agrupar por várias colunas)

É claro que você pode agrupar as linhas por mais de uma coluna.

Neste exemplo, examinaremos uma tabela de amostra orders que contém informações básicas sobre pedidos:

OrderIDCustomerIDProductIDProductCategoryOrderDateStatusAmount
11011001Electronics2023-05-01Completed150.00
21021002Clothing2023-05-02Completed80.00
31011001Home Goods2023-06-03In progress60.00
4103NULLAccessories2023-06-03Canceled200.00
51011002Electronics2023-07-04NULL120.00
61021001NULL2023-07-05NULLNULL
71031002Clothing2023-07-06In progress90.00
81021002Accessories2023-08-07NULL75.00
9103NULLNULL2023-08-08NULL100.00
101011001Home Goods2023-09-09NULLNULL
111021001Home Goods2023-06-05In progress80.00
121031004Accessories2023-06-06Completed75.00
131021005Electronics2023-08-06Completed88.00

Precisamos escrever uma consulta que mostrará o número de pedidos feitos por cada cliente e o endereço ProductCategory desse pedido. Isso significa que teremos de retornar o endereço CustomerID e a categoria em que o pedido se enquadra.

A consulta terá a seguinte aparência:

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
GROUP BY CustomerID, ProductCategory;

E o resultado da execução dessa consulta pode ser visto abaixo:

CustomerIDProductCategoryNumberOfOrders
101Electronics2
101Home Goods2
102Electronics2
102Accessories2
102Clothing1
103Accessories2
103Clothing1
103NULL1

Nossa consulta agrupa as linhas por duas colunas: CustomerID e ProductCategory. Isso significa que GROUP BY agrupa as linhas com os mesmos valores de CustomerID e ProductCategory em um único grupo. (As linhas para CustomerID 101 e a categoria Electronics estão em um grupo, mas as linhas para CustomerID 101 e a categoria Home Goods estão em um grupo diferente). Em seguida, as linhas em cada grupo são contadas por COUNT().

Exemplo nº 3: uso do WHERE com COUNT() e GROUP BY

Nosso exemplo anterior analisou um cenário em que queríamos criar um agregado de todas as informações em nossa tabela orders tabela. Mas, às vezes, podemos querer analisar essas informações e ver apenas os pedidos de categorias selecionadas.

Usando os mesmos dados de amostra que tínhamos antes, agora escreveremos uma consulta que mostra as mesmas informações para pedidos que se enquadram em "Accessories" (Acessórios) ou "Clothing" (Roupas) ProductCategory.

Para fazer isso, podemos usar a consulta do Exemplo 2 e adicionar uma cláusula WHERE. Essa cláusula filtrará os registros em que ProductCategory for igual a "Accessories" (Acessórios) ou "Clothing" (Roupas).

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Clothing’)
GROUP BY CustomerID, ProductCategory;
CustomerIDProductCategoryNumberOfOrders
102Accessories2
103Accessories1
102Clothing1
103Clothing1

Se não for totalmente intuitivo como o banco de dados gerou os resultados usando a consulta acima, aqui está uma explicação passo a passo do que aconteceu nos bastidores:

  1. Primeiro, o banco de dados examina a tabela orders e lê todas as linhas.
  2. Em seguida, ele aplica a condição de filtragem em WHERE ProductCategory IN (‘Accessories’, ‘Clothing’ ) para filtrar as linhas. Após essa etapa, somente as linhas em que a categoria do produto é "Accessories" (Acessórios) ou "Clothing" (Roupas) são consideradas para processamento posterior.
  3. As linhas filtradas são então agrupadas com base nos valores das colunas CustomerID e ProductCategory, que são especificadas na cláusula GROUP BY.
  4. Para cada uma das combinações exclusivas de CustomerID e ProductCategory, a função COUNT(*) é aplicada. Isso contará o número de linhas em cada grupo.
  5. O conjunto de resultados finais inclui CustomerID, ProductCategory e a contagem de pedidos (mostrada na coluna NumberOfOrders ) para cada grupo.

Em resumo, o banco de dados filtrará as linhas que respeitam a condição de filtragem especificada. Em seguida, ele as agrupará de acordo com as colunas especificadas na cláusula GROUP BY e calculará a contagem de pedidos em cada um desses grupos. O resultado final incluirá CustomerID, ProductCategory e a contagem correspondente de pedidos para cada combinação exclusiva de CustomerID e ProductCategory.

Exemplo nº 4: uso de ORDER BY com COUNT() e GROUP BY

Observando o resultado do exemplo número 4, podemos ver que algumas das linhas do resultado estão misturadas. Isso ocorre porque as colunas da lista GROUP BY geralmente exigem - mas não garantem - a classificação do resultado com base na lista de colunas da seção GROUP BY.

Mas se, por exemplo, precisarmos organizar os resultados em diferentes condições (por exemplo, uma linha do tempo ou por data), precisaremos usar uma cláusula ORDER BY:

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Electronics’)
GROUP BY CustomerID, ProductCategory
ORDER BY ProductCategory, CustomerID;
CustomerIDProductCategoryNumberOfOrdes
101Accessories2
102Accessories2
102Electronics1
103Electronics2

Adicionamos a cláusula ORDER BY com a lista de colunas pelas quais queremos classificar os dados. Como você pode ver, isso classifica as informações de saída com base na ordem das colunas listadas.

Exemplo nº 5: COUNT(expressão)

Até agora, vimos exemplos simples de como trabalhar com COUNT(); o objetivo era contar todas as linhas no conjunto de dados ou na tabela de origem.

Entretanto, há maneiras mais complexas de usar a combinação COUNT–GROUP BY. Para explicar isso, criaremos um novo conjunto de dados de amostra.

Temos uma tabela chamada SurveyResponses que armazena respostas a uma pesquisa. Algumas das perguntas são opcionais, e é por isso que há alguns entrevistados com valores de resposta NULL; eles pularam as perguntas opcionais. Você pode ver os dados de amostra abaixo:

ResponseIDRespondentIDRespondentNameQuestionIDAnswer
1101John1Agree
2101John2No
3101John3Yes
4102Sarah1Yes
5102Sarah2Not Sure
6102Sarah3NULL
7103Mark1No
8103Mark2Maybe
9103Mark3No
10104Emily1Yes
11104Emily2Not Sure
12104Emily3Disagree

COUNT(*) - Contagem de linhas

O uso mais comum da função COUNT (e sua funcionalidade padrão, mesmo que seja usada com GROUP BY) é contar o número de linhas. Por exemplo, se quisermos contar os tipos de resposta das perguntas da pesquisa, podemos usar a seguinte consulta:

SELECT COUNT(*) AS NumberOfYesAnswers, Answer
FROM SurveyResponses
GROUP BY Answer;

O resultado será semelhante a este:

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
1NULL

O resultado disso é uma contagem de todas as linhas que correspondem a uma determinada resposta. Ele retorna o número agregado de respostas da pesquisa e o tipo de resposta.

Contagem de valores NON-NULL em uma coluna

Vamos dar uma olhada em outro exemplo que pode parecer gerar os mesmos resultados. Na verdade, esse exemplo tem algo particular e importante: em vez de usar * como parâmetro em nossa função COUNT(), estamos usando COUNT() com um nome de coluna.

Modificaremos a consulta do exemplo anterior. Em vez do parâmetro * para a função COUNT(), nós o substituiremos pela coluna Answer. Nossa nova consulta tem a seguinte aparência:

SELECT 
  COUNT(Answer) AS NumberOfAnswers, 
  AnswerFROM SurveyResponses
GROUP BY Answer;

Se executarmos essa nova consulta, veremos que os resultados retornados são quase exatamente os mesmos:

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
0NULL

Podemos ver que o resultado do valor da resposta NULL mudou de 1 para 0. Isso ocorre porque a função COUNT() leva em consideração apenas os valores que não sãoNULL ao fazer a agregação.

Antes, estávamos fazendo COUNT(*), o que implicitamente significa contar as linhas; COUNT(Answer) contará os valores na coluna Answer. E como tínhamos 1 valor com NULL, ele ignorará esses valores em seu cálculo, retornando 0 nesse segundo cenário.

Contagem de valores distintos NON-NULL em uma coluna

Nesta terceira variação do uso da função COUNT, usaremos a mesma consulta do exemplo anterior. Desta vez, porém, adicionaremos a palavra-chave DISTINCT antes do nome da coluna.

SELECT 
  Answer, 
  COUNT(DISTINCT Answer) AS DistinctCount
FROM SurveyResponses
GROUP BY Answer;
StatusDistinctCount
Yes1
No1
Not Sure1
Agree1
Disagree1
Maybe1
NULL0

Podemos ver na saída acima que o resultado dessa consulta transformou todos os valores positivos da coluna DistinctCount em 1. Adicionar a palavra-chave DISTINCT significa que toda vez que a função COUNT encontrar um novo valor que não tenha visto antes, ela adicionará esse status à sua lista e acrescentará 1 à sua contagem. Entretanto, se encontrar o mesmo valor de status uma segunda vez ou mais, ela deixará de contá-lo.

Deseja saber mais sobre COUNT() e GROUP BY?

O uso do COUNT() com GROUP BY é apenas um dos muitos recursos avançados que o SQL oferece. Se quiser explorar mais o SQL e realmente dominar seus recursos, recomendo que você confira nosso abrangente curso SQL para Iniciantes . Se estiver procurando por prática de SQL, recomendo nossa Trilha de Práticas em SQL que tem mais de 600 exercícios práticos de SQL.

Depois de fazer nossos cursos, talvez você sinta que quer encontrar um emprego trabalhando com SQL. Para ajudá-lo a se preparar para a entrevista, temos uma lista de perguntas de entrevista sobre SQL que lhe mostrará alguns exemplos reais de perguntas e problemas em SQL.