Hola a todos!
Qué tal estáis?, espero que bien!!
En este post voy a tratar sobre Power Query, en concreto a continuar con este otro post: TRANSPONER RANGO EN HORIZONTAL SEGÚN NÚMERO DE ELEMENTOS REPETIDOS CON POWER QUERY
El motivo del post es el siguiente:
Imaginad que tenemos estos datos, donde tenemos listados una serie de proyectos y sus fechas para determinados trabajadores.
Y queremos obtener esta estructura, para mostrarla en una única fila.
Pues bien, antes de nada aclarar que esto lo podremos solucionar con VBA y con la mayoría de lenguajes. Hoy os presentaré una alternativa dentro de Power Query (y digo alternativa porque se podría realizar de alguna otra forma).
El código que he usado es el siguiente. He intentado comentarlo y explicarlo en la medida de lo posible. No obstante os dejo el archivo con los datos:
let
//Conectamos tabla
Origen = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
//convertimos formato en loa campos de la fecha
#"Tipo cambiado" = Table.TransformColumnTypes(Origen,{{"INICIO", type date}, {"FIN", type date}}),
//combinamos columnas y las unimos con un delimitador. Indicamos las columnas a combinar
#"Columnas combinadas" = Table.CombineColumns(Table.TransformColumnTypes(#"Tipo cambiado", {{"TIPO", type text}, {"INICIO", type text}, {"FIN", type text}}, "es-ES"),{"TIPO", "INICIO", "FIN"},Combiner.CombineTextByDelimiter("|", QuoteStyle.None),"AGRUPADO"),
//Agrupamos filas
#"Agrupar filas" = Table.Group(#"Columnas combinadas", {"ID"}, {{"Recuento", each Table.AddIndexColumn(_, "Cum",1,1), type table}}),
//Expandimos tabla
#"Recuento" = Table.ExpandTableColumn(#"Agrupar filas", "Recuento", {"AGRUPADO", "Cum"}, {"AGRUPADO", "Cum"}),
//pivotamos datos y mostramos datos de cada usuario por fila
#"Transponer" = Table.Pivot(Table.TransformColumnTypes(#"Recuento", {{"Cum", type text}}), List.Distinct(Table.TransformColumnTypes(#"Recuento", {{"Cum", type text}})[Cum]), "Cum", "AGRUPADO"),
//mediante un loop recorremos todas las columnas y cuando nos encontremos con el delimitador procedemos a dividir la columna
#"Output" = List.Accumulate(
Table.ColumnNames(Transponer),
Transponer,
(t, sc) =>
if List.AnyTrue(List.Transform(Table.Column(t, sc), each Text.Contains(_, "|")))
then
Table.SplitColumn(t, sc, Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv),3)
else t)
in
#"Output"
Os dejo el archivo para que podáis realizar consultas y utilizar el ejemplo.
Y esto es todo, espero que sea de utilidad!!