6 febrero, 2025

TRANSPONER RANGO EN HORIZONTAL SEGÚN NÚMERO DE ELEMENTOS REPETIDOS CON POWER QUERY II

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!!

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies