¿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:
- Agrupar por cliente, con una agregación de suma sobre la columna de ventas.
- Ordenar esa columna de importes en orden descendente (de Z a A), para tener a los clientes de mayor a menor facturación.
- 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 acumuladoList.Sum— suma los elementos de una listaList.Max— devuelve el mayor valor, aquí el último índice que cumple la condiciónTable.SelectRows— filtra una tabla según una condición, la base delBUSCARXsimuladolet ... in— saca un valor fuera del ámbito para poder usarlo dentro de uneachanidado
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
- BUSCARX con valor devuelto dinámico: elige la columna con un botón o un segmentador CasoUna integrante de la comunidad planteó un reto muy habitual al trabajar con tablas de varias columnas: tiene una lista de municipios con cua
- BUSCARX con múltiples columnas: por qué no funciona y 4 alternativas CasoJuan plantea una duda que muchos han tenido alguna vez: quiere que BUSCARX le devuelva varias columnas a la vez (nombre y apellidos), pero l
- Identificar proveedor en asientos contables con BUSCARX y BYROW CasoJuan comparte en el grupo una fórmula de John Vergara que le ha "salvado la vida laboral" para un problema clásico de contabilidad: en un di
- Filtrado inteligente de asientos contables con BUSCARX y BYROW CasoNuevo caso de contabilidad en la comunidad: dado un listado de asientos con múltiples cuentas (gastos 6xx/7xx e IVA 4xx), se necesita extrae
- Media móvil dinámica: 6 enfoques con SCAN, MMULT y MAP CasoUn miembro de la comunidad tiene un rango con ventas mensuales y necesita generar una columna con la media móvil de los últimos 3 meses usan
- Categorizar automáticamente conceptos con BUSCARX REGEX y MAP CasoUn miembro de la comunidad tiene una lista de compra (conceptos como "leche entera", "pan integral", etc.) y una tabla de categorías donde c
- BUSCARX explicado fácil TutorialDesde la sintaxis básica hasta trucos avanzados como expresiones regulares y cruce de rangos. Además, aprenderás a manejar errores y a usar
- Cómo dejar una celda realmente vacía en fórmulas SI, BUSCARX y FILTRAR CasoInteresante problema planteado por un miembro de la comunidad: quiere que sus fórmulas devuelvan una celda realmente vacía cuando no hay res
- Buscar múltiples palabras simultáneamente con FILTRAR y BYROW CasoJuan consigue filtrar una tabla buscando una palabra con HALLAR, pero cuando intenta buscar dos palabras a la vez pasando un rango (K16:L16)
- VALORCUBO devuelve vacío en vez de 0: cómo forzar el resultado numérico CasoUn miembro trabaja con funciones CUBO en Excel y se encuentra con un problema molesto: cuando VALORCUBO no encuentra datos que coincidan con