Como combinar COUNT e HAVING no SQL para contar apenas os dados que atendem a critérios específicos

Combinando a função COUNT do SQL com a cláusula HAVING, você pode contar eficientemente apenas os dados que atendem a critérios específicos. Neste artigo, explicaremos detalhadamente como utilizar esses recursos de SQL, desde os conceitos básicos até aplicações avançadas.

Índice

Uso básico da função COUNT

A função COUNT é uma função SQL usada para contar o número de valores em uma coluna especificada. Ela permite obter facilmente a quantidade de linhas em um banco de dados e é especialmente útil quando há valores NULL.

Sintaxe básica da função COUNT

SELECT COUNT(column_name)
FROM table_name;

Esta sintaxe conta o número de valores presentes na coluna column_name da tabela table_name.

Contar todas as linhas

Para contar todas as linhas, use o asterisco (*) no lugar do nome da coluna.

SELECT COUNT(*)
FROM table_name;

Isso conta o número total de linhas da tabela table_name.

Contar linhas que atendem a uma condição específica

Para contar apenas as linhas que atendem a um critério específico, combine a função COUNT com a cláusula WHERE.

SELECT COUNT(*)
FROM table_name
WHERE condition;

Neste exemplo, apenas as linhas que atendem à condição condition serão contadas.

Uso básico da cláusula HAVING

A cláusula HAVING é usada para definir condições sobre os resultados agrupados, após o uso de funções agregadas como SUM, COUNT ou AVG. Ao contrário da cláusula WHERE, a HAVING é aplicada após a agregação dos dados em grupos.

Sintaxe básica da cláusula HAVING

SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING condition;

Essa sintaxe retorna apenas os grupos que atendem à condição condition após o agrupamento por column_name.

Diferença entre WHERE e HAVING

A cláusula WHERE define uma condição antes da agregação ou agrupamento, enquanto a cláusula HAVING é aplicada após. Veja os exemplos abaixo:

-- Exemplo de uso de WHERE
SELECT column_name
FROM table_name
WHERE condition
GROUP BY column_name;

-- Exemplo de uso de HAVING
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;

WHERE aplica a condição antes do agrupamento, enquanto HAVING aplica a condição após o agrupamento.

Exemplo prático

A seguir, um exemplo prático de uso da cláusula HAVING. Por exemplo, para contar grupos que possuem mais de um item, a consulta seria:

SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 10;

Essa consulta conta o número de funcionários por departamento e retorna apenas os departamentos com mais de 10 funcionários.

Vantagens de combinar COUNT e HAVING

Combinando a função COUNT e a cláusula HAVING, é possível filtrar e agregar dados que atendem a critérios específicos de forma eficiente. Nesta seção, veremos algumas das principais vantagens dessa combinação.

Agregação condicional por grupo

Com COUNT e HAVING, é possível aplicar condições a grupos específicos e obter resultados agregados apenas desses grupos. Por exemplo, contar funcionários em departamentos com mais de 10 pessoas.

Exemplo

SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 10;

Essa consulta lista apenas os departamentos com mais de 10 funcionários.

Melhoria na precisão e eficiência dos dados

Ao usar a cláusula HAVING, você pode filtrar dados irrelevantes e extrair apenas o que é necessário, melhorando a precisão e a eficiência da análise de dados.

Exemplo

SELECT product_id, COUNT(order_id)
FROM orders
GROUP BY product_id
HAVING COUNT(order_id) > 50;

Essa consulta extrai apenas os IDs dos produtos que foram pedidos mais de 50 vezes.

Facilitação da visualização e relatórios de dados

A definição de condições para os resultados agregados facilita a visualização de dados e a criação de relatórios, ajudando a identificar tendências importantes e valores anômalos rapidamente.

Exemplo

SELECT sales_rep, COUNT(sale_id)
FROM sales
GROUP BY sales_rep
HAVING COUNT(sale_id) < 5;

Essa consulta identifica os vendedores que realizaram menos de 5 vendas, destacando áreas que precisam de melhoria.

Análise de dados flexível

Com a cláusula HAVING, você pode aplicar condições flexíveis aos dados agregados, facilitando a análise de dados complexos.

Exemplo

SELECT customer_id, COUNT(order_id)
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) BETWEEN 5 AND 10;

Essa consulta extrai os clientes que fizeram entre 5 e 10 pedidos.

A combinação de COUNT e HAVING permite extrair as informações necessárias de forma eficiente e melhorar a precisão da análise de dados.

Exemplos práticos de consultas SQL

A seguir, apresentamos alguns exemplos de consultas SQL que combinam a função COUNT com a cláusula HAVING, detalhando o funcionamento de cada uma.

Exemplo 1: Contar o número de funcionários por departamento e extrair departamentos com 10 ou mais funcionários

A consulta abaixo conta o número de funcionários em cada departamento na tabela de funcionários e extrai apenas os departamentos com 10 ou mais funcionários.

SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

Essa consulta agrupa por departamento e retorna a contagem de funcionários por grupo, filtrando apenas os departamentos com 10 ou mais funcionários.

Exemplo 2: Contar o número de pedidos por produto e extrair produtos com 50 ou mais pedidos

A consulta a seguir conta o número de pedidos por produto na tabela de pedidos e extrai apenas os produtos com 50 ou mais pedidos.

SELECT product_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY product_id
HAVING COUNT(order_id) >= 50;

Essa consulta agrupa por produto e retorna a contagem de pedidos por grupo, filtrando apenas os produtos com 50 ou mais pedidos.

Exemplo 3: Contar o número de pedidos por cliente e extrair clientes que fizeram entre 5 e 10 pedidos

A consulta a seguir conta o número de pedidos por cliente na tabela de pedidos e extrai apenas os clientes que fizeram entre 5 e 10 pedidos.

SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) BETWEEN 5 AND 10;

Essa consulta agrupa por cliente e retorna a contagem de pedidos por grupo, filtrando apenas os clientes com entre 5 e 10 pedidos.

Exemplo 4: Calcular o total de vendas por categoria e extrair categorias com total de vendas acima de $1000

A consulta a seguir calcula o total de vendas por categoria na tabela de vendas e extrai apenas as categorias cujo total de vendas ultrapassou $1000.

SELECT category, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY category
HAVING SUM(sales_amount) >= 1000;

Essa consulta agrupa por categoria e calcula o total de vendas por grupo, filtrando apenas as categorias com total de vendas superior a $1000.

Esses exemplos mostram como combinar eficazmente COUNT e HAVING para extrair dados que atendam a diversos critérios. A seguir, veremos exemplos mais avançados.

Exemplos avançados: Contagem condicional por grupo

Agora, veremos exemplos avançados de como contar dados por grupo com condições específicas, o que permite realizar análises de dados mais complexas.

Exemplo 1: Calcular o salário médio por departamento e extrair departamentos com salário médio de $50,000 ou mais

Esta consulta calcula o salário médio por departamento na tabela de funcionários e extrai apenas os departamentos cujo salário médio é de $50,000 ou mais.

SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 50000;

Esta consulta agrupa por departamento, calcula o salário médio por grupo e filtra apenas os departamentos com salário médio de $50,000 ou mais.

Exemplo 2: Calcular o total de vendas por vendedor e extrair vendedores com total de vendas acima de $100,000

A consulta a seguir calcula o total de vendas por vendedor na tabela de vendas e extrai apenas os vendedores cujo total de vendas ultrapassou $100,000.

SELECT sales_rep, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY sales_rep
HAVING SUM(sales_amount) >= 100000;

Esta consulta agrupa por vendedor, calcula o total de vendas por grupo e filtra apenas os vendedores com total de vendas acima de $100,000.

Exemplo 3: Calcular a avaliação média de cada produto e extrair produtos com avaliação média de 4.5 ou mais

A consulta a seguir calcula a avaliação média por produto na tabela de avaliações e extrai apenas os produtos com avaliação média de 4.5 ou mais.

SELECT product_id, AVG(rating) AS average_rating
FROM reviews
GROUP BY product_id
HAVING AVG(rating) >= 4.5;

Essa consulta agrupa por produto, calcula a média de avaliação por grupo e filtra apenas os produtos com média de avaliação de 4.5 ou mais.

Exemplo 4: Calcular o total de horas trabalhadas por projeto e extrair projetos com 100 horas ou mais

A consulta a seguir calcula o total de horas trabalhadas por projeto na tabela de horas de projetos e extrai apenas os projetos com 100 horas ou mais.

SELECT project_id, SUM(hours_worked) AS total_hours
FROM project_hours
GROUP BY project_id
HAVING SUM(hours_worked) >= 100;

Essa consulta agrupa por projeto, calcula o total de horas trabalhadas por grupo e filtra apenas os projetos com 100 horas ou mais.

Resumo

A combinação de COUNT e HAVING permite que você agregue e filtre dados de forma eficiente, atendendo a condições específicas. Isso melhora significativamente a precisão e a eficiência da análise de dados, permitindo obter insights importantes rapidamente. A seguir, vamos trabalhar em exercícios práticos para consolidar seu aprendizado.

Exercícios práticos

Através destes exercícios práticos utilizando COUNT e HAVING, você poderá desenvolver habilidades práticas na criação de consultas SQL. Tente resolver as questões a seguir para melhorar seu entendimento.

Questão 1: Contar o número de funcionários de departamentos que atendem a um critério específico

Crie uma consulta que conte o número de funcionários por departamento na tabela employees e extraia apenas os departamentos com 15 ou mais funcionários.

-- Resposta
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 15;

Questão 2: Extrair produtos com maior número de pedidos

Crie uma consulta que conte o número de pedidos por produto na tabela orders e extraia apenas os produtos com 30 ou mais pedidos.

-- Resposta
SELECT product_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY product_id
HAVING COUNT(order_id) >= 30;

Questão 3: Extrair produtos com alta avaliação

Crie uma consulta que calcule a avaliação média de cada produto na tabela reviews e extraia apenas os produtos com média igual ou superior a 4.0.

-- Resposta
SELECT product_id, AVG(rating) AS average_rating
FROM reviews
GROUP BY product_id
HAVING AVG(rating) >= 4.0;

Questão 4: Extrair vendedores com maior total de vendas

Crie uma consulta que calcule o total de vendas por vendedor na tabela sales e extraia apenas os vendedores com total de vendas superior a $200,000.

-- Resposta
SELECT sales_rep, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY sales_rep
HAVING SUM(sales_amount) >= 200000;

Questão 5: Calcular o total de horas trabalhadas por projeto

Crie uma consulta que calcule o total de horas trabalhadas por projeto na tabela project_hours e extraia apenas os projetos com 50 horas ou mais.

-- Resposta
SELECT project_id, SUM(hours_worked) AS total_hours
FROM project_hours
GROUP BY project_id
HAVING SUM(hours_worked) >= 50;

Resumo

Com esses exercícios práticos, você aprendeu a criar consultas SQL usando COUNT e HAVING. Aplicando essas habilidades, você poderá realizar agregações e análises avançadas em bancos de dados, extraindo informações valiosas para a tomada de decisões. A seguir, aprenderemos sobre erros comuns e como corrigi-los.

Erros comuns e como corrigi-los

Vamos abordar os erros mais comuns ao usar COUNT e HAVING, e as melhores maneiras de resolvê-los. Com esse conhecimento, você será capaz de depurar e corrigir consultas SQL com mais facilidade.

Erro 1: Coluna ‘column_name’ não está incluída na cláusula ‘GROUP BY’

Esse erro ocorre quando uma coluna na cláusula SELECT não está presente na cláusula GROUP BY.

-- Exemplo de erro
SELECT department, employee_name, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

Essa consulta gera erro porque a coluna employee_name não está incluída na cláusula GROUP BY.

Solução

Adicione todas as colunas da cláusula SELECT na cláusula GROUP BY.

-- Exemplo corrigido
SELECT department, employee_name, COUNT(employee_id)
FROM employees
GROUP BY department, employee_name
HAVING COUNT(employee_id) >= 10;

Erro 2: Coluna não agregada incluída na cláusula SELECT

Esse erro ocorre quando uma coluna que não é agregada está incluída na cláusula SELECT.

-- Exemplo de erro
SELECT department, salary, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

Essa consulta gera erro porque a coluna salary não está agregada.

Solução

Use uma função agregada ou adicione a coluna na cláusula GROUP BY.

-- Solução 1: Usar função agregada
SELECT department, AVG(salary) AS average_salary, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;
-- Solução 2: Adicionar à cláusula GROUP BY
SELECT department, salary, COUNT(employee_id)
FROM employees
GROUP BY department, salary
HAVING COUNT(employee_id) >= 10;

Erro 3: Função agregada no HAVING não está na cláusula SELECT

Esse erro ocorre quando a função agregada usada na cláusula HAVING não está presente na cláusula SELECT.

-- Exemplo de erro
SELECT department
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

Essa consulta gera erro porque a função COUNT não está na cláusula SELECT.

Solução

Adicione a função agregada usada na cláusula HAVING à cláusula SELECT.

-- Exemplo corrigido
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

Erro 4: Condição inválida na cláusula HAVING

Esse erro ocorre quando a condição na cláusula HAVING é inválida. Por exemplo, tentar comparar uma string com um número.

-- Exemplo de erro
SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) = 'ten';

Essa consulta gera erro porque 'ten' é uma string, mas a comparação é com um número.

Solução

Certifique-se de que o tipo de dado na cláusula HAVING seja correto.

-- Exemplo corrigido
SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

Resumo

Aprendemos sobre erros comuns ao usar COUNT e HAVING, e como resolvê-los. Com esse conhecimento, você será capaz de realizar agregações e filtragens de dados de maneira eficiente e correta. A seguir, vamos revisar os principais pontos deste artigo.

Conclusão

Combinando a função COUNT e a cláusula HAVING, você pode contar dados que atendem a critérios específicos de forma eficiente, permitindo uma análise detalhada por grupos. Abordamos desde o uso básico até exemplos avançados e erros comuns. Use essas habilidades na prática para obter insights valiosos dos seus bancos de dados. Ao maximizar o uso dessas funções de agregação no SQL, você pode aumentar a precisão e a eficiência da sua análise de dados.

Índice