Cómo hacer Top N Dinámico en Power BI: paso a paso
Este tutorial muestra cómo crear un Top N dinámico en Power BI controlado por un slicer, útil para destacar los principales clientes, productos o categorías y agregar el resto en 'Others'. Explica el porqué y ofrece pasos prácticos con DAX y modelado sencillo.
Requisitos previos
- Power BI Desktop (versión reciente).
- Una tabla de ventas con columnas: CustomerName, Product, SalesAmount, OrderDate.
- Conocimientos básicos de relaciones, tablas y medidas DAX.
Paso 1: Preparar la tabla de ranking
Necesitamos una tabla para seleccionar el N (Top 3, Top 10, etc.). Crea una tabla de parámetros en Power BI con números que tengan sentido para tu informe.
TopN = GENERATESERIES(1, 20, 1)
Después conviértela en un slicer en el informe para que el usuario elija el N. Esta tabla está desconectada (no necesita relaciones) y sirve para filtrado vía medidas DAX.
Paso 2: Medida de total de ventas
Crea una medida base con el total de ventas. Esta sirve como referencia para ranking y filtros.
Total Sales = SUM(Sales[SalesAmount])
Paso 3: Medida de ranking por dimensión
Vamos a crear una medida que calcula el rank de cada miembro (ej.: CustomerName) ordenado por Total Sales. Usamos RANKX con ALLSELECTED para respetar los slicers relevantes.
Customer Rank =
RANKX(
ALLSELECTED(Customer[CustomerName]),
CALCULATE([Total Sales]),
,
DESC,
DENSE
)
Paso 4: Medida que identifica Top N
Con el rank y el valor de TopN seleccionado, creamos una medida booleana que indica si un cliente está en el Top N elegido.
Is TopN =
VAR SelectedN = SELECTEDVALUE(TopN[Value], 5)
RETURN
IF([Customer Rank] <= SelectedN, 1, 0)
Paso 5: Medida para agrupar 'Others'
Queremos mostrar los Top N individualmente y sumar el resto en 'Others'. Crea una medida que devuelva el valor del cliente si está en el Top N o agregue para 'Others'.
TopN Sales =
VAR IsTop = [Is TopN]
RETURN
IF(
IsTop = 1,
[Total Sales],
BLANK()
)
Others Sales =
VAR SelectedN = SELECTEDVALUE(TopN[Value], 5)
VAR TableAll =
ADDCOLUMNS(
VALUES(Customer[CustomerName]),
"Rank", [Customer Rank],
"Sales", [Total Sales]
)
VAR OthersSum =
SUMX(
FILTER(TableAll, [Rank] > SelectedN),
[Sales]
)
RETURN
IF(HASONEVALUE(Customer[CustomerName]) = FALSE(), OthersSum, BLANK())
Paso 6: Construir el visual con 'Others'
Usa una tabla o gráfico de columnas. Coloca Customer[CustomerName] y la medida TopN Sales. Para incluir 'Others' en el mismo visual, crea una tabla auxiliar virtual con los Top N y una fila 'Others' o usa un visual combinado:
// Ejemplo simplificado para tabla virtual en un visual de tabla
Display Name =
IF([Is TopN] = 1, SELECTEDVALUE(Customer[CustomerName]), "Others")
Display Sales =
IF([Is TopN] = 1, [Total Sales], CALCULATE([Others Sales]))
Si lo prefieres, crea una tabla resumida con SUMMARIZE y úsala en un visual con la función 'Display Name' y 'Display Sales'.
Paso 7: Tratar empates y rendimiento
Los empates en el ranking pueden duplicar posiciones; usando DENSE evitas saltos, pero puedes usar SKIP para otro comportamiento. Para rendimiento, limita ALLSELECTED a una columna concreta y evita iteradores innecesarios en grandes volúmenes.
Verificar el resultado
Selecciona diferentes valores en el slicer TopN y verifica que el visual se actualiza: los N primeros aparecen individualmente y el total de las restantes entidades aparece como 'Others'. Confirma que los totales coinciden con el Total Sales general y prueba con diferentes filtros (fecha, producto) para garantizar que ALLSELECTED respeta los slicers deseados.
Conclusión
El Top N dinámico en Power BI permite dar foco a los items principales manteniendo contexto con el resto agregados. Próximos pasos: experimentar con Top N por producto, combinar con variables de tiempo y crear bookmarks para opciones predefinidas. Consejo: usa tooltips para explicar al usuario qué representa 'Others' y evitar confusiones.