Olá meus amiguinhos Linkedinzeiros, tudo
bem?
Hoje em mais uma dica de transformação de
dados utilizando o nosso amigo Power Query, vamos conhecer uma necessidade de
um colega dos Grupos de Whatsapp da vida que vai ver é a sua também, aprendendo
um pouco mais sobre Linguagem M.
Originalmente (e foi o que passei para ele)
eu criei a solução com Função Personalizada, que você pode conhecer um pouco
mais lá no meu canal nesse vídeo aqui:
Aproveita e inscreva-se no canal, macho vei.
No final do artigo eu deixo para vocês o
código M da solução com Função Personalizada.
Passado todo o lenga-lenga inicial, vamos
conhecer nossos dados a serem tratados hoje:
Nos nossos dados temos as seguintes
informações, uma coluna com "idreserva" que seria o identificador de
uma reserva de viagens, coluna "seqtrecho" que é uma sequência dos
trechos de viagens, ou seja, a pessoa pode ir para somente um destino como no
idreserva = 1 ou para vários destinos com a mesma reserva como no idreserva = 4
e por último temos "cidadede" que é a cidade de destino daquela
reserva no trecho especificado.
O nosso colega queria que em CADA idreserva
houvesse uma nova coluna com a listagem de todas as cidades destinos separados
por "/" .
Teríamos assim no idreserva = 1 a coluna
Lista com o valor AAA já que so temos um destino para essa idreserva, mas na
idreserva = 3 a nossa coluna Lista teria o valor SFS/GDG/HHF para cada uma das
3 linhas dessa id, que é a concatenação de todas as cidades destino.
Explicado o conceito vamos para a nossa
brincadeira.
1)
Agrupando dados
Precisamos inicialmente agrupar nossos dados
com base na coluna idreserva, fazendo com que tenhamos tabelas agrupadas para
cada idreserva.
Fazemos isso clicando com o botão direito no
cabeçalho da coluna "idreserva" e escolhendo a opção "Agrupar
por...".
Temos então a nossa tela de opções de
agrupamento.
Em "Operação" vamos alterar para
"Todas as linhas".
Finalizado isso temos então uma coluna de
Tabelas encapsuladas.
2)
Criando uma Lista a Partir das Tabelas Encapsuladas.
No Power Query temos 3 tipos básicos de
estrutura de dados, Registros, Listas e Tabelas.
Tabelas nada mais são que listas de várias
listas, então cada Coluna de uma tabela pode ser transformada numa lista dos
valores contidos naquela coluna específica.
Para tanto precisamos então selecionar
apenas uma Coluna da Nossa Tabela.
Fazemos isso então criando uma Coluna
Personalizada com a Função "Table.SelectColumns()".
A função Table.SelectColumns nos pede dois
Argumentos, que são, uma Tabela que será a COLUNA DE TABELAS ENCAPSULADAS e uma
Lista com os nomes das colunas a serem selecionada dessas Tabelas encapsuladas.
No caso queremos apenas a coluna "cidadede" que é a Coluna que
queremos concatenar suas linhas.
Então temos selecionada apenas a Coluna
"cidadede", mas verificamos que os dados ainda estão com a estrutura
"Table" e não é o que precisamos para a nossa transformação,
precisamos que a estrutura esteja como Lista. Então vamos transforma-la
aninhando a função já criada Table.SelectColumns() com a função Table.ToList()
que transforma uma coluna de uma tabela em uma Lista. E faremos isso
simplesmente alterando a nossa etapa de "Coluna Personalizada"
clicando na "Catraca" ao lado do nome da Etapa e editando a função.
Agora sim tenho Listas ao invés de Tabela.
Fiz vocês darem essa volta para entender o
conceito de aninhar funções no Power Query, mas poderíamos ter resolvido apenas
informando na nossa coluna personalizada o Nome da Tabela e Nome da coluna
dessa forma:
O resultado seria absolutamente o mesmo.
3)
Extraindo e Concatenando.
Para finalizar precisamos então extrair os
valores de dentro das listas concatenando-os com o "/" e isso é
facílimo, só precisava saber que é possível rs...
No cabeçalho ao lado do nome da Coluna de Listas
temos duas setas contrárias, clica nela e depois em "Extrair
Valores...."
Na tela que será aberta vamos escolher que
queremos concatenar os valores por um delimitador personalizado, e vamos
escrever qual é o delimitador.
Temos nossa lista de valores concatenados
Pronta.
Agora só extrair valores da coluna de
Tabelas.
E bammm, está pronto nosso desafio de hoje.
Agora só curtir e correr pro abraço.
Tem uma dúvida que ninguém conseguiu
resolver? Manda para mim que meus bots irão te ajudar e quem sabe sua dúvida
vai aparecer resolvida aqui.
Grande abraço e até a próxima.
Ahhh e não esqueci, segue o código M da
outra forma de resolver, com função personalizada.
let
Fonte = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSAWNHR0elWJ1oJSM43wnMN4byg92C4XyQGncXdzgfhD083MB8EzTzTKDqg6HqTaDqHYND4HwQ9nCLBPNNofr93DzAfDMoPzIoCM43grknFgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [idreserva = _t, seqtrecho = _t, cidadede = _t]),
#"Tipo Alterado" = Table.TransformColumnTypes(Fonte,{{"idreserva", Int64.Type}, {"seqtrecho", Int64.Type}, {"cidadede", type text}}),
Funcao = (idreserva as number) =>
let
#"Linhas Filtradas" = Table.SelectRows(#"Tipo Alterado", each ([idreserva] = idreserva)),
#"Colunas Removidas" = Table.RemoveColumns(#"Linhas Filtradas",{"idreserva", "seqtrecho"}),
cidadede = #"Colunas Removidas"[cidadede]
in
cidadede,
QuaseFinal = Table.AddColumn(#"Tipo Alterado", "Lista", each Funcao([idreserva])),
#"Valores Extraídos" = Table.TransformColumns(QuaseFinal, {"Lista", each Text.Combine(List.Transform(_, Text.From), "/"), type text})
in
#"Valores Extraídos"
Comentários
Postar um comentário