0Pricing
Coding Interview Prep · Aula

Transformando colunas em linhas

Revertendo tabelas largas com UNPIVOT ou UNION ALL.

Transformando colunas em linhas é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 3 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.

O problema inverso

O despivotamento é a imagem espelhada da criação de tabelas dinâmicas: você pega uma tabela larga e transforma suas colunas novamente em linhas. Os entrevistadores perguntam sobre isso quando os dados chegam no formato de uma planilha, mas precisam ser normalizados para análise.

Exemplo: uma tabela com as colunas q1, q2, q3, q4 por região precisa se tornar linhas de (region, quarter, amount). Esse formato longo é o preferido para agregação, junção e criação de gráficos.

-- Wide input we want to unpivot
region | q1  | q2  | q3  | q4
-------+-----+-----+-----+----
East   | 100 | 150 | 120 | 180
West   | 200 | 250 | 210 | 260

O padrão portável com UNION ALL

A resposta independente do dialeto é UNION ALL: escreva um SELECT para cada coluna de origem, e cada um emitirá um rótulo literal e o valor dessa coluna.

Use UNION ALL, não UNION, para não pagar o custo da remoção de duplicatas e manter todas as linhas, mesmo quando duas células compartilharem um valor.

SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL
SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL
SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL
SELECT region, 'Q4', q4 FROM wide_sales;

Por que UNION ALL, e não UNION

Esta é uma armadilha clássica de entrevistas. UNION remove linhas duplicadas de todo o resultado. Se as regiões Leste e Oeste tivessem 100 no 1º trimestre, um UNION simples juntaria as linhas idênticas, e você perderia dados.

UNION ALL concatena sem remover duplicatas, exatamente o que o despivotamento precisa. Ele também é mais rápido, pois não exige ordenação nem cálculo de dispersão para eliminar duplicatas.

-- UNION would wrongly merge identical (region, quarter, amount) rows
-- UNION ALL keeps every row, always the correct choice here

Alinhamento dos tipos de coluna

Cada ramificação de UNION ALL precisa produzir o mesmo número de colunas, com tipos compatíveis e na mesma ordem. Os nomes das colunas vêm do primeiro SELECT.

Se as suas colunas largas tiverem tipos diferentes (por exemplo, uma for int e outra, decimal), o mecanismo escolherá um tipo comum. Se forem realmente incompatíveis, faça a conversão explicitamente para que a operação UNION não falhe.

SELECT region, 'revenue' AS metric, CAST(revenue AS decimal(12,2)) AS val FROM t
UNION ALL
SELECT region, 'units',   CAST(units   AS decimal(12,2))        FROM t;

UNPIVOT do SQL Server

O SQL Server tem um operador UNPIVOT dedicado, mais conciso do que UNION ALL. Você nomeia a nova coluna de valores, a nova coluna de rótulos e lista as colunas de origem a combinar.

Um comportamento importante é que UNPIVOT remove as linhas em que o valor é NULL. Os entrevistadores verificam se você conhece esse efeito colateral.

SELECT region, quarter, amount
FROM wide_sales
UNPIVOT (
  amount FOR quarter IN (q1, q2, q3, q4)
) AS u;

UNPIVOT remove valores NULL

Se uma região tiver NULL em q3, o UNPIVOT do SQL Server simplesmente omitirá essa linha da saída. Se você precisar de uma linha para cada coluna, independentemente dos valores NULL, recorra a UNION ALL, que os preserva.

Explique essa diferença em uma entrevista: o UNPIVOT nativo é conciso, mas perde linhas com NULL; UNION ALL é verboso, mas completo.

-- UNPIVOT: q3 NULL for East -> no (East, Q3) row produced
-- UNION ALL: (East, 'Q3', NULL) row IS produced

PostgreSQL: LATERAL VALUES

O PostgreSQL não tem UNPIVOT, mas um padrão enxuto é usar um CROSS JOIN LATERAL sobre uma lista de VALUES. Cada linha larga é expandida em relação a uma pequena tabela embutida de pares (rótulo, valor).

Isso é mais limpo do que um UNION ALL longo e lê a tabela de origem apenas uma vez.

SELECT w.region, v.quarter, v.amount
FROM wide_sales w
CROSS JOIN LATERAL (VALUES
  ('Q1', w.q1),
  ('Q2', w.q2),
  ('Q3', w.q3),
  ('Q4', w.q4)
) AS v(quarter, amount);

Lendo a tabela uma única vez

Vale mencionar um ponto de desempenho: a abordagem ingênua com UNION ALL examina a tabela larga uma vez por ramificação (quatro leituras para quatro trimestres). A forma com LATERAL VALUES e o UNPIVOT do SQL Server leem a origem uma única vez.

Em tabelas grandes, isso faz diferença. Se você precisar usar UNION ALL, um otimizador ainda poderá fazer leituras repetidas, portanto mencione LATERAL ou UNPIVOT como a opção mais eficiente.

Filtrando células vazias

Com UNION ALL ou LATERAL, você mantém as linhas com valores NULL. Se a pergunta exigir apenas células preenchidas, adicione um filtro. Isso reproduz o que o UNPIVOT do SQL Server faz automaticamente.

Decidir se os valores NULL devem ser mantidos ou removidos é uma decisão de contexto, portanto esclareça o requisito com o entrevistador antes de escrever o código.

SELECT region, quarter, amount
FROM (
  SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
  UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
) t
WHERE amount IS NOT NULL;

Exemplo resolvido: agregação após a despivotagem

Uma pergunta comum que vem em seguida: "da tabela trimestral ampla, forneça a receita total por região em todos os trimestres." Depois que você transforma os dados para o formato longo, a agregação é trivial: um único SUM agrupado por região.

Isso demonstra o verdadeiro motivo para despivotar primeiro. Somar quatro colunas separadas é frágil, mas um SUM(amount) GROUP BY region no formato longo é escalável para qualquer quantidade de trimestres.

WITH long_sales AS (
  SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
  UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
  UNION ALL SELECT region, 'Q3', q3 FROM wide_sales
  UNION ALL SELECT region, 'Q4', q4 FROM wide_sales
)
SELECT region, SUM(amount) AS total
FROM long_sales
GROUP BY region;

Quando despivotar

Reconheça o sinal de despivotagem em um problema descrito em palavras:

  • A entrada tem colunas repetidas que, na verdade, são valores (meses, anos, métricas).
  • Você precisa agregar, fazer junções ou criar gráficos com base nesses valores.
  • Você deseja normalizar dados de planilhas desnormalizados durante a importação.

O formato longo quase sempre é a estrutura certa para trabalhos posteriores em SQL, portanto despivotar é uma etapa inicial frequente.

Verificação rápida

Confirme que você conhece a armadilha mais comum da despivotagem.

Recapitulação

A despivotagem transforma colunas em linhas:

  • Portátil: um SELECT por coluna, unidos com UNION ALL (nunca use apenas UNION).
  • SQL Server: UNPIVOT nativo, conciso, mas descarta valores NULL.
  • PostgreSQL: CROSS JOIN LATERAL (VALUES ...), com uma única varredura.
  • Alinhe as quantidades e os tipos de colunas entre os ramos; filtre valores NULL se a pergunta exigir.

Perguntas Frequentes

A aula “Transformando colunas em linhas” é grátis?

Sim — o texto completo de “Transformando colunas em linhas” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.

O que vou aprender em “Transformando colunas em linhas”?

Revertendo tabelas largas com UNPIVOT ou UNION ALL. Você pratica Coding 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 Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding 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 3 de 4.

Quanto tempo leva a aula “Transformando colunas em linhas”?

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

Sim. Cada aula de Coding 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 Coding Interview Prep