0Pricing
SQL Interview Prep · Aula

Transformação com agregação condicional

O padrão portátil de usar CASE dentro de SUM para transformar linhas em colunas.

Transformação com agregação condicional é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 1 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

O contexto da entrevista

Uma das tarefas mais comuns em entrevistas sobre relatórios é: transformar linhas em colunas. Você tem uma tabela longa como sales(region, quarter, amount), e o entrevistador quer um relatório amplo com uma coluna por trimestre.

A resposta portátil e independente de dialeto que eles esperam ouvir é a agregação condicional: uma expressão CASE colocada dentro de uma função agregadora, como SUM. Domine esse padrão e você poderá fazer uma tabela dinâmica em qualquer banco de dados, até mesmo naqueles que não têm a palavra-chave PIVOT.

Formato longo versus amplo

Antes de criar a tabela dinâmica, nomeie os formatos. O formato longo armazena um fato por linha: cada par região/trimestre ocupa sua própria linha. O formato amplo distribui uma categoria entre colunas.

  • Longo: fácil de inserir, difícil de ler lado a lado.
  • Amplo: excelente para um relatório voltado a pessoas.

Uma tabela dinâmica transforma o formato longo em amplo. Os entrevistadores gostam disso porque testa se você entende agregação, e não apenas sintaxe.

-- Long form (the input)
region | quarter | amount
-------+---------+-------
East   | Q1      | 100
East   | Q2      | 150
West   | Q1      | 200
West   | Q2      | 250

O padrão principal

O truque é: para cada coluna de saída, escreva um CASE que retorne o valor quando a linha corresponder àquela coluna e NULL caso contrário. Envolva-o em uma função agregadora para que o agrupamento seja reduzido a uma linha por chave.

Leia assim: some o valor, mas somente para as linhas do primeiro trimestre. Como SUM ignora NULL, as linhas que não correspondem não contribuem com nada.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

Por que SUM ignora NULL

Esse padrão funciona por causa de um fato que os entrevistadores investigarão: as funções agregadoras ignoram NULL. Um CASE sem ELSE retorna NULL quando nenhuma ramificação corresponde, portanto SUM(CASE WHEN ... THEN amount END) soma somente as linhas selecionadas.

Se você escrevesse ELSE 0, também funcionaria com SUM (adicionar zero não altera nada), mas quebraria AVG, MIN e COUNT.

-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)

Exemplo prático: relatório trimestral

Aqui está a consulta completa sobre os dados de exemplo. Cada região se torna uma linha; cada trimestre, uma coluna.

O GROUP BY region é o que reduz as quatro linhas de entrada a duas linhas de saída. Sem ele, você obteria uma linha por linha de entrada, com principalmente valores NULL.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

-- Result:
-- region | q1  | q2
-- East   | 100 | 150
-- West   | 200 | 250

Escolhendo a agregação correta

A agregação que envolve o CASE deve corresponder à pergunta:

  • SUM quando cada célula totaliza valores.
  • MAX ou MIN quando cada par região/trimestre tem exatamente um valor e você só quer exibi-lo.
  • COUNT quando cada célula conta linhas correspondentes.

Os entrevistadores costumam perguntar a variante com COUNT: quantos pedidos há por status e por mês?

SELECT
  month,
  COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;

MAX para células de valor único

Quando cada par chave/categoria contém um único valor (uma verdadeira tabela cruzada, não um total), use MAX ou MIN. Ambos retornam o único valor não NULL e ignoram os valores NULL das ramificações sem correspondência.

Essa é a escolha segura quando você está remodelando atributos em vez de somar valores monetários, por exemplo, transformando uma tabela de configurações de chave/valor em uma linha por entidade.

-- Turn key/value rows into one wide row per user
SELECT
  user_id,
  MAX(CASE WHEN attr = 'city'  THEN value END) AS city,
  MAX(CASE WHEN attr = 'plan'  THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;

Lidando com células de saída NULL

Se uma região não teve vendas no 2º trimestre, sua célula q2 resulta em NULL. Os entrevistadores podem pedir que você mostre 0 no lugar. Envolva toda a agregação em COALESCE.

Coloque COALESCE fora da agregação, não dentro do CASE, para substituir o valor somente quando o grupo inteiro não tiver linhas correspondentes.

SELECT
  region,
  COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
  COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;

Adicionando uma coluna de total geral

Uma pergunta complementar comum é adicionar um total de todas as colunas da tabela dinâmica. Não é necessário somar as colunas pelo nome. Um SUM(amount) simples sobre o mesmo grupo fornece o total da linha, pois ignora completamente a filtragem do CASE.

Isso mostra ao entrevistador que você entende que cada agregação no SELECT é calculada independentemente sobre o mesmo grupo.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
  SUM(amount) AS total
FROM sales
GROUP BY region;

O atalho da agregação com filtro

PostgreSQL e o padrão SQL oferecem FILTER (WHERE ...), uma forma mais limpa de escrever a agregação condicional. A leitura fica melhor e evita o código repetitivo do CASE.

Mencione isso em uma entrevista para demonstrar conhecimento amplo, mas saiba que MySQL e SQL Server não oferecem suporte a esse recurso, portanto CASE continua sendo a resposta portável.

-- Postgres / standard SQL
SELECT
  region,
  SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
  SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;

A grande limitação

Há uma ressalva sobre a agregação condicional que os entrevistadores insistirão em abordar: você precisa listar manualmente todas as colunas de saída. Se os trimestres ou as categorias não forem conhecidos antecipadamente, essa consulta estática não poderá se adaptar.

Esse problema é chamado de operação PIVOT dinâmica e requer SQL gerado. Para um conjunto fixo e conhecido de categorias, porém, a agregação condicional é a opção mais limpa e portável.

Verificação rápida

Teste seu domínio do padrão de agregação condicional.

Recapitulação

A agregação condicional é a forma portável de criar tabelas dinâmicas que todo entrevistador aceita:

  • Um CASE para cada coluna de saída, envolvido em uma agregação.
  • SUM para totais, MAX/MIN para células de valor único, COUNT para contagens.
  • Funciona porque as agregações ignoram o NULL das ramificações sem correspondência.
  • Use COALESCE para transformar células vazias em 0.
  • Limitação: as colunas precisam ser fixadas no código, o que nos leva às operações PIVOT dinâmicas a seguir.

Perguntas Frequentes

A aula “Transformação com agregação condicional” é grátis?

Sim — o texto completo de “Transformação com agregação condicional” é 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 Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “Transformação com agregação condicional”?

O padrão portátil de usar CASE dentro de SUM para transformar linhas em colunas. Você pratica SQL Interview Prep 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 Interview Prep?

Nenhuma experiência prévia é necessária. SQL Interview Prep 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 1 de 4.

Quanto tempo leva a aula “Transformação com agregação condicional”?

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 Interview Prep?

Sim. Cada aula de SQL Interview Prep 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. Transformação com agregação condicional
  2. Sintaxe PIVOT de fornecedores e de tabela cruzada
  3. Transformando colunas em linhas
  4. PIVOTs dinâmicos com colunas desconhecidas
← Voltar para SQL Interview Prep