Me planteaban hace unos días la posibilidad de obtener una numeración ordinal (1,2,3,...) para los distintos valores de cada fila, de acuerdo a su aparción de izquierda a derecha de ciertos campos..
Veremos un par de métodos:
-uno clásico empleando Grupos, columnas de Índice y las opciones de Dinamizar y Anular dinamización
-un segundo empleando Records appoyándonos en la función List.Generate, algo más elegante.
Lo primero será cargar nuestra tabla con ventas ('TblVENTAS') al editor de Power Query, y con la tabla cargada procederemos a generar una segunda consulta como referencia de la tabla subida.
Con la consulta editada, escribimos el siguiente código...
El punto interesante de este primer método es que mediante la función List.Generate hemos podido generar un Record, con dos variables x e y, que mediante ciertos condicionales, devuelven el orden buscado 1,2,3,... para aquellos valores distintos de cero!!.
Recuerda los argumentos de la función:
1- punto de inicio
2- punto/condición de salida
3- punto de incremento o siguiente valor
4- punto a devolver
El valor de la x corresponde al contador de valores, mientras que la y responde al valor incremental buscado.
Con el segundo método solo tenemos que usar el asistente de pasos, y seguirlos en la secuencia correcta:
En una secuencia de ocho pasos tendríamos el siguiente código
El resultado es el mismo... ;-)
El sentido de este ejercicio podría ser, sobre todo empleando el primer método, recuperar exclusivamente el primer valor de cada registro (o la/s posiciones que neceistáramos).
Un filtro aplicado en el momento-paso adecuado, nos daría el resultado.
Veremos un par de métodos:
-uno clásico empleando Grupos, columnas de Índice y las opciones de Dinamizar y Anular dinamización
-un segundo empleando Records appoyándonos en la función List.Generate, algo más elegante.
Lo primero será cargar nuestra tabla con ventas ('TblVENTAS') al editor de Power Query, y con la tabla cargada procederemos a generar una segunda consulta como referencia de la tabla subida.
Con la consulta editada, escribimos el siguiente código...
let
Origen = TblVENTAS,
//obtenemos los encabezados de la tabla
Encab=Table.ColumnNames(Origen),
//ya que a partir de ellos obtendremos automáticamente aquellas columnas que tengan un valor numérico
//i.e., las columnas con 'años', que serán sobre las que trabajaremos.
lstFechas=List.Select(Encab, each Value.Is(Value.FromText(_), type number)),
//añadimos un registro compuesto de un dato por cada año
//autonumerado de izquierda a derecha por orden de aparición
//siempre que sea distinto de cero
AddRecord = Table.AddColumn( Origen,
"DATOS",
each
let
Lst=List.ReplaceValue(Record.ToList(Record.SelectFields(_, lstFechas)), null,0, Replacer.ReplaceValue),
num=List.Count(Lst),
Acum=List.Generate(
() =>
[ x = 1, y=if Number.From(Lst{0})<>0 then {1} else {0}],
each [x] <= num,
each [ y = if Number.From(Lst{[x]})<>0 then [y] & {1} else [y] & {0} ,
x= [x]+1 ],
each if List.Last([y])=0 then 0 else List.Sum([y]) )
in
Record.FromList(Acum, lstFechas) ),
//discriminamos campos 'viejos' para evitar conflicto con los nuevos generados
SelCols=Table.SelectColumns(AddRecord,{"País","DATOS"}),
//expandimos el REgistro
ExpandeDATOS = Table.ExpandRecordColumn(SelCols, "DATOS", lstFechas, lstFechas)
in
ExpandeDATOSEl punto interesante de este primer método es que mediante la función List.Generate hemos podido generar un Record, con dos variables x e y, que mediante ciertos condicionales, devuelven el orden buscado 1,2,3,... para aquellos valores distintos de cero!!.
Recuerda los argumentos de la función:
1- punto de inicio
2- punto/condición de salida
3- punto de incremento o siguiente valor
4- punto a devolver
El valor de la x corresponde al contador de valores, mientras que la y responde al valor incremental buscado.
Con el segundo método solo tenemos que usar el asistente de pasos, y seguirlos en la secuencia correcta:
En una secuencia de ocho pasos tendríamos el siguiente código
let
Origen = TblVENTAS,
//seleccionamos las columnas de los años y Reemplazamos Valores
Reemplazo_0_Null = Table.ReplaceValue(Origen,0,null,Replacer.ReplaceValue,{"2021", "2022", "2023", "2024", "2025"}),
//Seleccionamos la columna País y anulamos la dinamización de las otras columnas
Anulacion_dinamizacion = Table.UnpivotOtherColumns(Reemplazo_0_Null, {"País"}, "Atributo", "Valor"),
//Seleccionamos País y agrupamos
Agrupo_Pais = Table.Group(Anulacion_dinamizacion, {"País"}, {{"Recuento", each _, type table [País=text, Atributo=text, Valor=number]}}),
//Añadimos una columna personalizada, donde como fórmula incorporamos la que añade una columna índice
AddIndice = Table.AddColumn(Agrupo_Pais, "ConINDICE", each Table.AddIndexColumn([Recuento],"Id",1,1)),
//Nos quedamos solo con esta última columna recién creada
OtrasColumnasQuitadas = Table.SelectColumns(AddIndice,{"ConINDICE"}),
//y la expandimos
Expandimos = Table.ExpandTableColumn(OtrasColumnasQuitadas, "ConINDICE", {"País", "Atributo", "Id"}, {"País", "Atributo", "Id"}),
//dinamizamos la columna de Atributo (que corresponde a los Años)
ColumnaDinamizada = Table.Pivot(Expandimos, List.Distinct(Expandimos[Atributo]), "Atributo", "Id", List.Sum),
//y finalmente reordenamos o seleccionamos las columnas en el orden deseado
SelCols=Table.SelectColumns(ColumnaDinamizada, {"País","2021", "2022", "2023", "2024", "2025"})
in
SelColsEl resultado es el mismo... ;-)
El sentido de este ejercicio podría ser, sobre todo empleando el primer método, recuperar exclusivamente el primer valor de cada registro (o la/s posiciones que neceistáramos).
Un filtro aplicado en el momento-paso adecuado, nos daría el resultado.





No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.