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.
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ê:
| Produto | Jan | Fev | Mar |
|---|---|---|---|
| Notebook | 120 | 135 | 150 |
| Mouse | 800 | 760 | 900 |
| Teclado | 300 | 320 | 310 |
E este é o depois, o mesmo dado em formato longo, já pronto para o modelo:
| Produto | Mês | Vendas |
|---|---|---|
| Notebook | Jan | 120 |
| Notebook | Fev | 135 |
| Notebook | Mar | 150 |
| Mouse | Jan | 800 |
| Mouse | Fev | 760 |
| Mouse | Mar | 900 |
| Teclado | Jan | 300 |
| Teclado | Fev | 320 |
| Teclado | Mar | 310 |
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.
- Abra o Power Query. No Power BI Desktop, vá em Transformar dados para entrar no Editor do Power Query com a sua consulta carregada.
- 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.
- 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.
- 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.
- 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.
- 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 interface | Função M gerada | O que ela faz |
|---|---|---|
| Unpivot Columns | Table.Unpivot | Transforma em linhas apenas as colunas que você selecionou, listando cada uma pelo nome |
| Unpivot Other Columns | Table.UnpivotOtherColumns | Transforma em linhas tudo que você NÃO selecionou, mantendo fixas só as colunas escolhidas |
| Unpivot Only Selected Columns | Table.Unpivot | Igual 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ção | Formato de matriz (meses em colunas) | Formato longo tabular |
|---|---|---|
| Somar o total do ano | Precisa somar doze colunas na mão | SUM(Vendas[Vendas]) resolve tudo |
| Chegou um mês novo | Editar medida, visual e modelo | Nada muda, só recarregar |
| Relacionar com calendário | Praticamente inviável | Relacionamento direto pela coluna de data |
| Filtrar por trimestre | Não dá sem gambiarra | Filtro natural pela dimensão tempo |
| Criar inteligência de tempo | Sofrível | TOTALYTD, 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