Medidas Rotativas en DAX: Cuando tus datos no se están quietos
TL;DR
- Productos que cambian de categoría con el tiempo → problema de “medidas rotativas”
- El cliente quiere ver todo reclasificado según el último período
- Patrón: capturar clasificación del último período y aplicarla hacia atrás
- Usa REMOVEFILTERS + tabla temporal con la clasificación actual
El marrón
Te cuento un escenario que me ha tocado más de una vez: tienes productos (o clientes, o lo que sea) que cambian de categoría con el tiempo. Un producto que en Q1 era “Premium”, en Q2 lo bajan a “Estándar” porque no ha vendido lo esperado.
El usuario abre Power BI, selecciona Q1 y Q2 en el filtro, y pregunta:
¿Cuánto vendimos en Premium?
Y aquí viene el momento incómodo: ¿le sumas lo que ERA Premium en Q1, o lo que ES Premium según la clasificación actual?
El 90% de las veces, el cliente quiere lo segundo. Quiere ver todo reclasificado según el último período. Pero DAX, bless his heart, por defecto te va a sumar cada cosa según cómo estaba clasificada en su momento.
La solución: Medidas Rotativas
El patrón tiene truco, pero una vez lo pillas es pan comido:
- Pillar el último período del contexto de filtro
- Buscar cómo están clasificados los productos EN ESE período
- Aplicar esa clasificación hacia atrás a TODOS los períodos
Ventas Rotativas =
VAR UltimoPeriodo =
MAXX(
VALUES(Calendario[Periodo]),
Calendario[Periodo]
)
VAR ProductosClasificados =
CALCULATETABLE(
SUMMARIZE(
Productos,
Productos[ID],
Productos[Categoria]
),
Productos[Periodo] = UltimoPeriodo
)
RETURN
CALCULATE(
[Ventas],
REMOVEFILTERS(Productos[Categoria]),
ProductosClasificados
)
Por qué funciona
- MAXX + VALUES: Coge el período más reciente de los que el usuario ha seleccionado
- CALCULATETABLE + SUMMARIZE: Crea una tablita temporal con la foto de clasificación de ese período
- REMOVEFILTERS: Borra los filtros originales de categoría (si no, se pisan)
- ProductosClasificados: Reaplica la clasificación del último período a toda la consulta
Básicamente estás diciendo: “ignora cómo estaban clasificados antes, usa SOLO la clasificación actual”.
Bonus: mostrar la categoría actual en texto
Si además quieres una columna que muestre la categoría vigente (no sumar, solo mostrar el texto), el truco es SELECTEDVALUE:
Categoria Actual =
VAR UltimoPeriodo =
MAXX(
VALUES(Calendario[Periodo]),
Calendario[Periodo]
)
RETURN
CALCULATE(
SELECTEDVALUE(Productos[Categoria]),
Productos[Periodo] = UltimoPeriodo
)
En los totales devolverá BLANK, que es correcto. No tiene sentido mostrar una categoría cuando hay múltiples productos mezclados.
Dónde lo vas a necesitar
Cualquier negocio donde las cosas cambien de caja:
- Retail con productos que cambian de temporada o sección
- Servicios con clientes que suben/bajan de tier
- Equipos comerciales donde los vendedores cambian de zona
- Inventario con productos que se reclasifican
Si tienes una dimensión que no es estática en el tiempo, tarde o temprano te va a tocar esto.
¿Te ha servido? Tengo más patrones DAX oscuros en el cajón, como Rolling 12 meses con dos calendarios.
¿Empezando con DAX? Lee primero Qué es DAX en Power BI: Guía para principiantes.
También te puede interesar
Rolling 12 meses en DAX: la solución de dos calendarios
Cómo calcular rolling 12 months en Power BI correctamente. Tutorial DAX paso a paso.
Qué es DAX en Power BI: Guía práctica para principiantes (con ejemplos)
Aprende DAX desde cero: qué es, para qué sirve, diferencia con Power Query, las 5 funciones esenciales y errores comunes. Con ejemplos de código.
Power BI desactivó tu relación y no te avisó
Guía completa sobre relaciones inactivas en Power BI: por qué aparecen, cómo detectarlas, USERELATIONSHIP, role-playing dimensions y patrones avanzados.