SQL Academy · Aula

CASE em ORDER BY e agregações

Ordenação e contagem condicionais.

Aula 4 de 413 etapas

CASE em ORDER BY e agregações é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

Ordenação com prioridade personalizada

A cláusula ORDER BY do SQL normalmente ordena as linhas pelo valor natural de uma coluna. Mas você pode inserir uma expressão CASE em ORDER BY para criar uma ordem de ordenação completamente personalizada — uma que nenhuma coluna isolada poderia produzir.

Essa técnica é poderosa quando as regras de negócio determinam a prioridade, e não os valores brutos dos dados.

SELECT product_name, status
FROM products
ORDER BY
  CASE status
    WHEN 'urgent'   THEN 1
    WHEN 'active'   THEN 2
    WHEN 'pending'  THEN 3
    ELSE                 4
  END;

Como funciona o CASE dentro de ORDER BY

Quando o banco de dados avalia ORDER BY CASE ... END, ele calcula um inteiro (ou qualquer valor comparável) para cada linha. As linhas são então ordenadas por esse valor calculado, em vez de — ou além de — uma coluna bruta.

A expressão CASE não é armazenada; ela existe apenas durante a execução da consulta.

SELECT order_id, priority
FROM orders
ORDER BY
  CASE priority
    WHEN 'high'   THEN 1
    WHEN 'medium' THEN 2
    WHEN 'low'    THEN 3
    ELSE               9
  END,
  order_id;

Ordenando NULL explicitamente

Por padrão, diferentes bancos de dados posicionam NULL no início ou no fim de um resultado ordenado de maneiras diferentes. Um CASE em ORDER BY permite decidir exatamente onde NULL ficará — independentemente do mecanismo de banco de dados.

SELECT employee_name, manager_id
FROM employees
ORDER BY
  CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
  manager_id;

Ordenação crescente e decrescente condicional

Um CASE em ORDER BY também pode simular uma direção condicional. Ao mapear valores de categorias para números negativos, você pode efetivamente inverter a ordem de ordenação de grupos específicos, mantendo a ordem normal para os demais.

Isso é útil quando diferentes tipos de linha precisam de lógicas de ordenação diferentes em um único conjunto de resultados.

SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
  CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
  due_date;

CASE dentro de COUNT

Você pode inserir uma expressão CASE dentro de uma função de agregação como COUNT. O truque é retornar um valor diferente de NULL para as linhas que deseja contar e NULL para as linhas que deseja ignorar — porque COUNT ignora NULL.

SELECT
  COUNT(CASE WHEN status = 'active'   THEN 1 END) AS active_count,
  COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;

CASE dentro de SUM — Totais condicionais

Colocar CASE dentro de SUM permite somar valores apenas quando uma condição é verdadeira e tratar as linhas que não correspondem como zero. Esse é um padrão muito comum para relatórios no estilo de tabela dinâmica que dividem uma única coluna em várias colunas de métricas.

SELECT
  SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
  SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
  SUM(CASE WHEN region = 'East'  THEN sales_amount ELSE 0 END) AS east_total
FROM sales;

AVG condicional com CASE

O mesmo padrão funciona com AVG. Como AVG ignora NULL, retornar NULL para as linhas que deseja excluir produz a média apenas das linhas correspondentes — sem necessidade de uma subconsulta.

SELECT
  AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
  AVG(CASE WHEN department = 'Marketing'   THEN salary END) AS avg_mkt_salary
FROM employees;

Agrupamento com CASE — Categorização de linhas

Você pode usar CASE na lista de GROUP BY ou SELECT para categorizar valores contínuos em categorias e, em seguida, agregar cada categoria. Isso transforma uma coluna numérica em grupos rotulados sem alterar os dados subjacentes.

SELECT
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END AS age_group,
  COUNT(*) AS user_count
FROM users
GROUP BY
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END;

Usando um nome alternativo em vez de repetir CASE

Repetir uma expressão CASE longa em SELECT e GROUP BY torna o código prolixo. Alguns bancos de dados (MySQL, PostgreSQL com soluções alternativas) permitem referenciar o nome alternativo em ORDER BY, mas não em GROUP BY. A abordagem portável mais segura é envolver a consulta em uma subconsulta ou CTE e fazer GROUP BY pelo nome alternativo a partir dela.

WITH scored AS (
  SELECT
    customer_id,
    CASE
      WHEN total_spent >= 1000 THEN 'Gold'
      WHEN total_spent >= 500  THEN 'Silver'
      ELSE                          'Bronze'
    END AS tier
  FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
  CASE tier
    WHEN 'Gold'   THEN 1
    WHEN 'Silver' THEN 2
    ELSE               3
  END;

Combinando ORDER BY CASE com ASC / DESC

Após a expressão CASE, você ainda pode acrescentar ASC ou DESC e adicionar mais colunas de ordenação separadas por vírgulas. A pontuação do CASE é apenas a primeira chave de ordenação; as colunas seguintes resolvem os empates da maneira normal.

SELECT
  ticket_id,
  category,
  created_at
FROM support_tickets
ORDER BY
  CASE category
    WHEN 'billing'  THEN 1
    WHEN 'outage'   THEN 2
    WHEN 'feature'  THEN 3
    ELSE                 4
  END ASC,
  created_at ASC;

Exemplo do mundo real — Painel de vendas

Aqui está uma consulta realista que combina uma agregação baseada em CASE com uma ordenação baseada em CASE. Ela produz um resumo de vendas por região, ordenado de modo que a região com a maior receita sempre apareça primeiro, com 'Outros' no final.

SELECT
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END AS region_label,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
  COUNT(CASE WHEN status = 'refunded' THEN 1 END)           AS refund_count
FROM orders
GROUP BY
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END
ORDER BY completed_sales DESC;

Verificação de conhecimentos

Teste sua compreensão de como usar CASE dentro de ORDER BY e funções de agregação.

Recapitulação da lição

Nesta lição, você aprendeu a combinar CASE com ORDER BY e funções de agregação:

  • CASE em ORDER BY — atribuir pontuações de ordenação personalizadas às linhas, controlar onde os valores NULL aparecem e combinar várias regras de ordenação em uma única consulta.
  • CASE em COUNT — retornar um valor não NULL para as linhas a incluir e NULL (implícita ou explicitamente) para as linhas a ignorar.
  • CASE em SUM / AVG — usar 0 ou NULL como valor de ELSE para criar totais e médias condicionais em uma única passagem.
  • CASE em GROUP BY — agrupar valores contínuos ou categóricos em grupos rotulados para agregação.

Esses padrões eliminam muitas subconsultas e tornam simples escrever relatórios no estilo de tabela dinâmica usando SQL puro.

Grátis para começar

Aprenda SQL com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
46
Aulas
183

Perguntas Frequentes

A aula “CASE em ORDER BY e agregações” é grátis?

Sim — o texto completo de “CASE em ORDER BY e agregações” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “CASE em ORDER BY e agregações”?

Ordenação e contagem condicionais. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Academy?

Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “CASE em ORDER BY e agregações”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Academy?

Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. A expressão CASE
  2. CASE pesquisado versus simples
  3. Agrupando e rotulando dados
  4. CASE em ORDER BY e agregações
← Voltar para SQL Academy