Pular para o conteúdo
Fynx
Business Intelligence12 min de leitura

Power Query: como transformar colunas com Unpivot

Aprenda no Power Query transformar colunas com Unpivot: passo a passo para virar meses em colunas num formato longo tabular, com código M e boas práticas.

F
Fynx

Aquela planilha com um mês em cada coluna vai quebrar seu modelo

Você recebe do financeiro uma planilha linda de olhar e péssima de modelar: uma linha por produto e uma coluna para cada mês do ano, de Jan até Dez. Para o olho humano é perfeita. Para o Power BI é uma armadilha. É aí que entra o assunto deste artigo: no Power Query transformar colunas com Unpivot é o passo que separa um relatório que trava de um modelo que roda liso e escala sem dor.

O problema desse formato de matriz é que ele mistura duas coisas que deveriam ser separadas: o nome do período (um dado) e o valor (outro dado). Cada mês virou coluna, então a cada mês novo você mexe na medida, no visual, no relacionamento. É trabalho manual recorrente e fonte garantida de erro. Neste guia vou mostrar o passo a passo do Unpivot, as três variações da operação, o código M de cada uma e por que o formato longo é o que o modelo realmente quer.

O que o Unpivot faz: ele transforma colunas em linhas

Unpivot é o oposto do pivot. Em vez de espalhar valores em colunas, ele empilha colunas em linhas. Você pega várias colunas que na verdade representam a mesma coisa (valores mensais) e transforma cada uma delas em uma dupla de campos: um com o nome da antiga coluna (o atributo) e outro com o conteúdo dela (o valor).

Na prática, uma tabela larga com doze colunas de mês vira uma tabela estreita e comprida, com uma coluna de mês e uma de valor. Por isso se fala em formato "longo" ou "tabular": ele cresce para baixo, em linhas, e não para o lado, em colunas.

Veja o antes. Este é o formato de matriz que chega para você:

ProdutoJanFevMar
Notebook120135150
Mouse800760900
Teclado300320310

E este é o depois, o mesmo dado em formato longo, já pronto para o modelo:

ProdutoMêsVendas
NotebookJan120
NotebookFev135
NotebookMar150
MouseJan800
MouseFev760
MouseMar900
TecladoJan300
TecladoFev320
TecladoMar310

Repare no que mudou. Antes, "Jan" era o nome de uma coluna, parte da estrutura. Depois, virou valor de dado dentro da coluna Mês. Isso muda tudo para o Power BI: agora você filtra, agrupa e relaciona por mês como faz com qualquer campo.

Passo a passo para transformar colunas com Unpivot

O caminho pela interface é curto, e a escolha entre os três botões define se o ETL vai aguentar o tempo ou quebrar no mês que vem.

  1. Abra o Power Query. No Power BI Desktop, vá em Transformar dados para entrar no Editor do Power Query com a sua consulta carregada.
  2. Garanta que os cabeçalhos estão certos. Confirme que os nomes das colunas de mês estão na linha de cabeçalho, e não como primeira linha de dados. Se preciso, use Usar primeira linha como cabeçalho.
  3. Selecione as colunas de valor. Clique na coluna Jan, segure Ctrl e clique nas demais colunas de mês, ou segure Shift para selecionar um intervalo contínuo. Deixe de fora as colunas que descrevem a linha, como Produto.
  4. Aplique o Unpivot. Vá na aba Transformar e clique em Transformar Colunas em Linhas (Unpivot Columns). O menu suspenso do botão traz as três opções que veremos a seguir.
  5. Renomeie as colunas geradas. O Power Query cria duas colunas chamadas Atributo e Valor. Renomeie para algo com significado de negócio, como Mês e Vendas.
  6. Ajuste os tipos de dados. Defina o tipo da coluna de valor como número decimal ou inteiro e trate a coluna de mês conforme sua necessidade de ordenação.

Feito isso, sua matriz virou uma tabela tabular longa. O passo 4 é onde mora a decisão importante, então vamos abrir as três opções.

As três opções de Unpivot e quando usar cada uma

O botão de Unpivot esconde três comportamentos diferentes. Parecem sutis, mas a escolha errada é a origem de metade dos ETLs que quebram sozinhos.

Opção na interfaceFunção M geradaO que ela faz
Unpivot ColumnsTable.UnpivotTransforma em linhas apenas as colunas que você selecionou, listando cada uma pelo nome
Unpivot Other ColumnsTable.UnpivotOtherColumnsTransforma em linhas tudo que você NÃO selecionou, mantendo fixas só as colunas escolhidas
Unpivot Only Selected ColumnsTable.UnpivotIgual ao Unpivot Columns, transforma só o que você marcou, útil quando você quer ser explícito

Unpivot Columns

Você seleciona as colunas de mês e manda transformar. O Power Query gera um Table.Unpivot que lista pelo nome cada coluna que você marcou. É direto, mas tem um custo: a lista de colunas fica gravada no código. Se no próximo ano chegar uma coluna nova, ela não estará na lista e vai ser ignorada silenciosamente.

let
    Fonte = Excel.Workbook(File.Contents("C:\dados\vendas.xlsx"), null, true),
    Planilha = Fonte{[Item="Vendas",Kind="Sheet"]}[Data],
    Cabecalho = Table.PromoteHeaders(Planilha, [PromoteAllScalars=true]),
    Unpivot = Table.Unpivot(
        Cabecalho,
        {"Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"},
        "Mês",
        "Vendas"
    )
in
    Unpivot

Unpivot Other Columns

Aqui a lógica se inverte, e é justamente a inversão que resolve o problema do futuro. Você seleciona só as colunas que devem ficar fixas, no caso o Produto, e manda transformar as outras. O Power Query gera um Table.UnpivotOtherColumns, que não guarda a lista de meses no código: ele guarda a lista do que fica de fora. Resultado prático: quando aparecer uma coluna de mês nova, ela cai automaticamente no Unpivot, sem você tocar em nada.

let
    Fonte = Excel.Workbook(File.Contents("C:\dados\vendas.xlsx"), null, true),
    Planilha = Fonte{[Item="Vendas",Kind="Sheet"]}[Data],
    Cabecalho = Table.PromoteHeaders(Planilha, [PromoteAllScalars=true]),
    Unpivot = Table.UnpivotOtherColumns(
        Cabecalho,
        {"Produto"},
        "Mês",
        "Vendas"
    )
in
    Unpivot

Note a diferença no segundo argumento. No Table.Unpivot você lista os doze meses. No Table.UnpivotOtherColumns você lista apenas {"Produto"}. É menos código, é mais legível e é resistente a mudança. Por isso, na esmagadora maioria dos casos com meses em colunas, a recomendação é usar Unpivot Other Columns. É a opção que sobrevive ao tempo.

Unpivot Only Selected Columns

Essa opção existe para quando você quer deixar claro que só as colunas marcadas devem ser transformadas, e nada além. Ela também gera Table.Unpivot, mas o gesto na interface é explícito: transforma o que você selecionou, ponto. Serve para proteger colunas de transformação acidental. É a mais conservadora das três.

A regra prática de projeto é simples: se a tabela pode ganhar colunas novas do mesmo tipo com o tempo (meses, anos, filiais), use Unpivot Other Columns. Se a estrutura é fixa e você quer travar o que transforma, use Unpivot Columns ou Only Selected Columns.

Por que o formato longo é melhor para o modelo

Não é preferência estética. O formato longo tabular é o que o modelo dimensional espera. Uma tabela fato bem construída tem uma linha por evento (uma venda, um lançamento, um registro), com o período em coluna própria, e não espalhado em doze colunas. É isso que permite ligar a fato a uma tabela calendário, escrever medidas DAX que funcionam para qualquer período e criar visuais que se adaptam sozinhos.

Compare o que você consegue fazer em cada formato:

SituaçãoFormato de matriz (meses em colunas)Formato longo tabular
Somar o total do anoPrecisa somar doze colunas na mãoSUM(Vendas[Vendas]) resolve tudo
Chegou um mês novoEditar medida, visual e modeloNada muda, só recarregar
Relacionar com calendárioPraticamente inviávelRelacionamento direto pela coluna de data
Filtrar por trimestreNão dá sem gambiarraFiltro natural pela dimensão tempo
Criar inteligência de tempoSofrívelTOTALYTD, SAMEPERIODLASTYEAR funcionam

Com a tabela larga, cada medida referencia colunas específicas de mês. Total = [Jan] + [Fev] + [Mar] + .... É frágil e quebra na primeira mudança. Com a tabela longa, uma única medida SUM(Vendas[Vendas]) responde por qualquer recorte de tempo, porque o mês agora é um filtro, não uma coluna. Essa é a base de toda modelagem e boas práticas de DAX que a gente aplica.

Se você monta um modelo do zero e quer entender onde o Unpivot se encaixa no fluxo maior, vale ler nosso guia completo de Power BI para empresas. É uma etapa pequena, mas daquelas que decidem a saúde do projeto inteiro.

Como o formato longo ajuda o VertiPaq

O VertiPaq é o motor de armazenamento colunar do Power BI. Ele guarda cada coluna separadamente e comprime cada uma pela quantidade de valores distintos que ela tem. Quanto menos valores únicos numa coluna e quanto mais repetição, melhor a compressão e menor a memória.

O formato de matriz atrapalha esse motor. Você tem doze colunas numéricas, cada uma comprimida por conta própria, sem o motor enxergar que é tudo a mesma medida. E muitas células podem estar vazias, com nulos espalhados por doze colunas que não ajudam a compressão.

No formato longo, você tem uma coluna de valor numérico. O VertiPaq comprime essa coluna única de ponta a ponta, aproveitando toda a repetição. A coluna de mês tem pouquíssimos valores distintos (doze no máximo) e comprime extremamente bem. O resultado costuma ser um modelo mais leve, mais rápido de varrer e mais simples de manter.

Vale a honestidade de consultor: nem sempre a tabela longa fica menor em disco que a larga, porque ela repete as chaves em cada linha. O ganho real não é só tamanho, é o comportamento do modelo, com desempenho previsível conforme os dados crescem. Em cenário de volume grande e ingestão recorrente, essa é uma decisão que se cuida junto de uma boa engenharia de dados.

Um detalhe que salva: trate o tipo antes e depois

Duas armadilhas comuns fecham o assunto. A primeira: se uma etapa de "tipo alterado" travar os nomes das colunas antes do Unpivot, o Power Query pode reclamar quando uma coluna nova aparecer. Aplique o Unpivot cedo no fluxo, antes de fixar tipos coluna a coluna.

A segunda: depois do Unpivot, a coluna de mês vem como texto ("Jan", "Fev"). Para ordenar e ligar a uma tabela calendário, transforme esse texto em uma data real, a partir do nome do mês e de um ano de referência:

let
    Origem = PassoAnterior,
    ComData = Table.AddColumn(
        Origem,
        "Data",
        each #date(
            2026,
            List.PositionOf(
                {"Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"},
                [Mês]
            ) + 1,
            1
        ),
        type date
    )
in
    ComData

Com uma coluna de data de verdade, o relacionamento com o calendário fica trivial e toda a inteligência de tempo passa a funcionar. Esse tratamento é padrão nos nossos projetos de Power BI: é o que garante que o modelo aguenta virada de ano sem retrabalho.

Perguntas frequentes

Qual é a diferença entre Unpivot Columns e Unpivot Other Columns? Unpivot Columns transforma em linhas exatamente as colunas que você selecionou e grava esses nomes no código M, via Table.Unpivot. Unpivot Other Columns transforma tudo que você não selecionou e grava no código só as colunas que ficam fixas, via Table.UnpivotOtherColumns. Na prática, o segundo é mais resistente a colunas novas.

Por que devo preferir Unpivot Other Columns para meses? Porque colunas de mês tendem a crescer com o tempo. Quando chega Jan do ano seguinte, o Unpivot Other Columns já a inclui automaticamente, pois ele só conhece as colunas fixas (como Produto). O Unpivot Columns comum ignoraria a coluna nova em silêncio, o que gera erro difícil de perceber.

Unpivot deixa meu modelo mais pesado? Depende. A tabela longa repete os valores das colunas de chave em cada linha, então pode ocupar mais espaço bruto que a larga. Em compensação, a coluna única de valor comprime muito bem no VertiPaq e o modelo fica mais rápido e previsível. O ganho principal é de comportamento e manutenção, não necessariamente de disco.

Como faço para reverter, se precisar da matriz de volta? A operação inversa é o Pivot, ou Table.Pivot em M. Mas o certo é manter os dados no formato longo dentro do modelo e deixar que o Power BI monte a visão de matriz nos visuais, com uma matriz ou tabela dinâmica. Você não precisa da matriz nos dados, só na tela.

Preciso mexer no código M ou dá para fazer tudo pela interface? Dá para fazer tudo pela interface, clicando nos botões da aba Transformar. O código M é gerado sozinho. Conhecer o código ajuda a entender qual função foi usada, a ajustar detalhes e a auditar consultas de outras pessoas, mas não é obrigatório para o dia a dia.

O Unpivot serve só para meses? Não. Serve para qualquer caso em que colunas diferentes representam a mesma categoria de dado: filiais, anos ou tipos de produto em colunas. Sempre que o cabeçalho de uma coluna for na verdade um valor de dado, o Unpivot é a ferramenta certa.

Feche o loop antes de modelar

Transformar aquela matriz de meses em tabela longa é um dos passos mais baratos e rentáveis de um projeto de BI. Custa poucos cliques e evita meses de retrabalho. A regra é simples: matriz é para o olho humano, tabela longa é para o motor. Comece o ETL pelo Unpivot e prefira o Unpivot Other Columns quando as colunas puderem crescer.

Se você tem planilhas assim se acumulando e quer um modelo que aguente o crescimento sem quebrar a cada virada de mês, fale com a gente. A gente ajuda a estruturar o ETL, o modelo e as medidas do jeito que escala.

Quer aplicar isso na sua empresa?

A Fynx implementa BI, Power BI e Power Platform de ponta a ponta. Conte seu cenário e devolvemos um diagnóstico direto ao ponto.

Falar com um especialista

Vamos transformar seus dados em decisão?

Conte seu cenário. Devolvemos um diagnóstico e uma proposta com faixa de investimento em poucos dias úteis, sem folheto, direto ao ponto.