¿Clasificación ABC en PowerQuery? Sí, es posible

¿Clasificación ABC en PowerQuery? Sí, es posible

¿PowerQuery puede hacer una clasificación ABC sin SCAN ni BUSCARX? ¡Sí, es posible! En este tutorial te muestro cómo transformar una tabla de ventas por cliente en un análisis comercial completo usando solo PowerQuery.

Aprenderás a:
- Crear un ranking de clientes con Agrupar por
- Calcular el acumulado por fila con código M
- Simular la búsqueda por tramos sin BUSCARX
- Asignar categorías A, B y C automáticamente
- Unir la tabla original con la clasificación ABC mediante un join

Este método es ideal para quienes trabajan con Excel avanzado, Power BI o análisis comercial, y quieren automatizar procesos sin depender de fórmulas externas.

Clasificación ABC sin salir de Power Query

Power Query no tiene SCAN ni BUSCARX. Y aun así se puede montar una clasificación ABC de clientes completa: sin fórmulas de Excel, sin macros y sin complementos.

La gracia de hacerlo así es doble. Por un lado acabas con una tabla de ventas que ya trae la categoría ABC asignada y lista para tus informes, actualizándose sola. Por otro, entiendes de verdad cómo funciona Power Query por dentro, que es donde está el aprendizaje que luego reutilizas en todo lo demás.

Partimos de una tabla de ventas y de una tabla de categorías donde se indica a partir de qué porcentaje acumulado empieza cada tramo A, B o C.

Paso 1: cargar y tipar

Con los datos ya en formato de tabla, se cargan con Datos → De una tabla o rango. Power Query trae las columnas pero no acierta con los tipos, así que lo primero es asignarlos a mano: cliente y producto como texto, ventas como número decimal. Es un paso aburrido que evita errores más adelante.

Paso 2: el ranking de clientes

Duplicamos la consulta y la llamamos ranking. Construir un ranking es más sencillo de lo que parece:

  1. Agrupar por cliente, con una agregación de suma sobre la columna de ventas.
  2. Ordenar esa columna de importes en orden descendente (de Z a A), para tener a los clientes de mayor a menor facturación.
  3. Agregar columna → Columna de índice, empezando desde 1.

Esa columna de índice es la posición en el ranking, y es la pieza que hace posible todo lo que viene después.

Paso 3: el acumulado, sin SCAN

El cálculo ABC necesita ir acumulando el porcentaje de venta que representan los clientes. En Excel eso lo resolvería SCAN, pero en Power Query no existe. La alternativa está en las funciones de lista.

Añadimos una columna personalizada llamada acumulado. La idea es esta: al referenciar el paso anterior indicando la columna de ventas, obtenemos la lista completa de ventas. Con List.FirstN limitamos esa lista a tantos elementos como diga la columna de índice de cada fila. Y como lo que queremos es la suma de esos elementos, envolvemos el resultado en List.Sum.

= List.Sum(List.FirstN(#"Paso anterior"[Ventas]; [Índice]))

Fila a fila, cada una suma sus propios elementos y todos los anteriores. Eso es exactamente un acumulado.

Paso 4: pasar el acumulado a porcentaje

El acumulado está en valores absolutos y lo necesitamos en porcentaje sobre el total. Basta con dividir entre la suma de toda la columna de ventas del paso anterior:

= [Acumulado] / List.Sum(#"Paso anterior"[Ventas])

Ahora los datos son porcentuales e incrementales, y la última fila vale 1, que es el 100% de las ventas acumuladas. Buena señal de que el cálculo está bien.

Paso 5: simular BUSCARX con búsqueda aproximada

Aquí está la parte interesante. Hay que mapear cada tramo de la tabla de categorías contra esos porcentajes, y Power Query no tiene una búsqueda aproximada que lo haga sola.

La estrategia: para cada categoría, buscar el mayor elemento del ranking que todavía cumple la condición de quedar por debajo del porcentaje de referencia. Se añade una columna personalizada sobre la tabla de categorías con Table.SelectRows filtrando la tabla de ranking.

Y aquí aparece el detalle que hace tropezar a casi todo el mundo: el alcance de las variables. Cuando tienes un each dentro de otro each, el segundo trabaja en el ámbito de la tabla ranking y no ve el campo porcentaje, que pertenece a la tabla de categorías. La solución es sacar ese valor fuera con let y darle un nombre de variable:

= let limite = [Porcentaje] in
  List.Max(Table.SelectRows(Ranking; each limite >= [Acumulado])[Índice])

Al usar la variable limite dentro del filtro, ya no hay conflicto de ámbitos. De la tabla filtrada nos quedamos solo con la columna de índice y aplicamos List.Max para obtener el índice del último cliente que cumple cada condición.

Paso 6: unir todo

Quedan dos combinaciones:

  • Ranking con categorías usando el índice como clave, con combinación externa izquierda. Solo quedan marcadas las filas donde hay cambio de categoría; el resto llega como nulo. Se resuelve con la opción Rellenar hacia abajo para propagar cada categoría hasta el siguiente cambio.
  • Ventas con la asignación por cliente, esta vez con combinación interna, porque todos los clientes tienen asignación. Se expande seleccionando únicamente la columna de categoría.

El resultado coincide línea a línea con la versión calculada en Excel con SCAN y BUSCARX.

Funciones clave

  • List.FirstN — toma los primeros N elementos de una lista, el truco del acumulado
  • List.Sum — suma los elementos de una lista
  • List.Max — devuelve el mayor valor, aquí el último índice que cumple la condición
  • Table.SelectRows — filtra una tabla según una condición, la base del BUSCARX simulado
  • let ... in — saca un valor fuera del ámbito para poder usarlo dentro de un each anidado

Conclusión

Lo que parecía una limitación (no hay SCAN, no hay BUSCARX) se resuelve entendiendo cómo trabaja Power Query con listas y con ámbitos. El resultado es un proceso automatizado de principio a fin: actualizas y la clasificación ABC se recalcula sola.

En la comunidad de InflueXcel salen cada semana casos como este, con varios enfoques distintos para el mismo problema.

Más casos con estas funciones

Más contenido de Excel en InflueXcel