27th Jul 2023 10 minutos de leitura Como usar COUNT() com GROUP BY: 5 exemplos práticos Radu Gheorghiu sql group by Índice Como usar COUNT() e GROUP BY Quando usar GROUP BY Quando usar a função COUNT() 5 exemplos de uso de COUNT() com GROUP BY Exemplo nº 1: GROUP BY em uma única coluna Exemplo nº 2: GROUP BY Multiple Columns (agrupar por várias colunas) Exemplo nº 3: uso do WHERE com COUNT() e GROUP BY Exemplo nº 4: uso de ORDER BY com COUNT() e GROUP BY Exemplo nº 5: COUNT(expressão) COUNT(*) - Contagem de linhas Contagem de valores NON-NULL em uma coluna Contagem de valores distintos NON-NULL em uma coluna Deseja saber mais sobre COUNT() e GROUP BY? 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: Primeiro, o banco de dados examina a tabela orders e lê todas as linhas. 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. 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. 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. 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. Tags: sql group by