jueves, 17 de junio de 2021

Power Query: Top 3 ventas por cliente

Veremos hoy un clásico del análisis de ventas: Listado del top 3 de ventas por cada cliente... resuelto con Power Query.
Partiremos de un sencillo listado (que ya he ordenado para verificar los resultados obtenidos):
Power Query: Top 3 ventas por cliente


Notemos algo que en ocasiones pasamos por alto.. en uno de los clientes aparece un importe repetido (en segunda y tercera posición). Obviamente, en mi opinión, ambas facturas de ventas deberán aparecer en nuestro listado.

Así pues cargaremos la tabla de ventas 'TblVENTAS' al editor de Power Query, y desde ahí entraremos al Editor avanzado donde escribiremos:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblVENTAS"]}[Content],
    GrupoCliente = Table.Group(Origen, 
            {"Cliente"}, 
            { {"Sum3", each List.Sum( List.FirstN (List.Sort([Total],Order.Descending),3) )},
               {"Top3", each Text.Combine(List.Transform(List.FirstN (List.Sort([Total],Order.Descending),3),each Number.ToText(_) ),", ")} }),
    
    
    DividirColumna = Table.SplitColumn(GrupoCliente, "Top3", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), {"Top3.1", "Top3.2", "Top3.3"}),
    TipoCambiado = Table.TransformColumnTypes(DividirColumna,{{"Top3.1", Int64.Type}, {"Top3.2", Int64.Type}, {"Top3.3", Int64.Type}})
in
    TipoCambiado

Power Query: Top 3 ventas por cliente


Lo relevante del ejemplo es cómo con la función M: Table.Group conseguimos nuestros listados
Table.Group(table as table, key as any, aggregatedColumns as list, optional groupKind as nullable number, optional comparer as nullable function) as table
agrupamos sobre el campo 'Cliente' e incorporamos dos nuevas 'columnas agregadas': 'Sum3' y 'Top3'.

La primera 'Sum3' responde a una secuencia de funciones M anidadas, donde primero ordenamos en descendente la lista de importes 'Total' de cada cliente (con List.Sort), para luego recuperar los tres primeros con List.FirstN.
Esta combinación sería la equivalente de DAX: TOPN.
Finalmente, para 'Sum3' aplicamos List.Sum para acumular los tres 'totales' resultantes... para cada cliente.

Para la otra columna agregada 'Top3' a partir de la base anterior (List.FirstN sobre List.Sort), y con el fin de concatenar los tres 'totales' obtenidos, le aplicaremos una función List.Transform para convertir en texto cada importe, y poder unirlos con Text.Combine.

Para acabar dividiremos en tres columnas esta combinación y aplicaremos un cambio en el tipo de datos de éstas.

El resultado es el esperado:
Power Query: Top 3 ventas por cliente

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.