3.1CALCULATE, contexto de filtro y variables (VAR)
Lo esencial en 30 segundos
- Cada celda de un visual tiene su propio contexto de filtro: la celda «París × Enero» de una matriz calcula [Total Ventas] filtrado por París Y enero, sin que usted haya escrito nada.
- CALCULATE modifica ese contexto: añade un filtro, sobrescribe otro o lo retira con ALL — la clave de los «% del total».
- VAR/RETURN estructuran toda fórmula que supere una línea: legibilidad, rendimiento y depuración más fáciles.
Mini-caso continuo — Zineb lee sus celdas en voz alta en Argel
Zineb, controladora de gestión en una pyme agroalimentaria de Argel, muestra una matriz Ciudad × Mes de su [Total Ventas] y se queda perpleja ante una celda que parece falsa. Aplica el método de la sección: en lugar de reescribir la medida, lee el contexto en voz alta —«esta celda = ventas filtradas por Lyon Y enero»— y comprende que cada celda tiene el suyo. Añade entonces Ventas Todas Ciudades = CALCULATE([Total Ventas], ALL(Ventas[Ciudad])): el mismo valor en todas partes, con el filtro de ciudad retirado. Después compone la cuota de cada ciudad con una variable: Cuota ciudad = VAR Total = CALCULATE([Total Ventas], ALL(Ventas[Ciudad])) RETURN DIVIDE([Total Ventas], Total). Lo prueba con un segmentador Comercial activo: la cuota se recalcula dentro del ámbito del segmentador — exactamente lo que quiere explicar a su dirección.
Caso autónomo de esta sección: reaparece en el curso, el esquema, el guion y el reto de 48 h de la sección 3.1.
1. El contexto de filtro
He aquí el capítulo que separa al usuario del practicante de DAX. Todo cálculo se evalúa en un contexto de filtro: la celda «París × Enero» de una matriz calcula [Total Ventas] filtrado por París Y enero — sin que usted haya escrito nada. Cada celda de un visual tiene el suyo: ejes, leyendas, segmentadores y filtros se suman allí.
2. CALCULATE, ALL y VAR
CALCULATE MODIFICA ese contexto: añade un filtro, sobrescribe otro (la cuota del total) o lo retira con ALL. ALL(Ventas[Ciudad]) ignora el filtro de ciudad y da el total general — es la clave del cálculo más solicitado: el «% del total».
3. Estructurar y diagnosticar
Se envuelve todo en variables VAR/RETURN: el total global se calcula una vez, la fórmula se lee de un tirón y la depuración se vuelve sencilla. El reflejo de diagnóstico cabe en una frase: un resultado DAX «raro» es casi siempre un contexto mal comprendido — Zineb lo lee en voz alta antes de tocar la fórmula.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — El % del total
El cálculo más solicitado, en fórmulas cortas y legibles:
Ventas Todas Ciudades = CALCULATE([Total Ventas], ALL(Ventas[Ciudad]))
Cuota ciudad =
VAR Total = CALCULATE([Total Ventas], ALL(Ventas[Ciudad]))
RETURN DIVIDE([Total Ventas], Total) // formateada en %
Lectura: ALL(Ventas[Ciudad]) retira el filtro de ciudad: la medida muestra el mismo valor en cada fila — el total de todas las ciudades.
Lección: DIVIDE([Total Ventas], Total) da la cuota de cada ciudad, recalculada dentro del ámbito de los segmentadores activos.
Vocabulario de la sección
- Contexto de filtro
- El conjunto de filtros activos sobre una celda de visual (ejes, leyendas, segmentadores, filtros): cada celda tiene el suyo.
Ejemplo sencillo: Zineb enuncia: «la celda Lyon × Enero = ventas filtradas por Lyon y enero».
Lo que no es: un cálculo único válido para todo el visual.
Reflejo: resultado raro → leer el contexto en voz alta.
- CALCULATE
- Evalúa una expresión en un contexto modificado: añade o sobrescribe un filtro.
Ejemplo sencillo: Zineb fuerza un filtro sobre una ciudad gracias a CALCULATE para aislar su resultado.
Lo que no es: una medida que sufre el contexto sin modificarlo.
Reflejo: modificar un filtro → CALCULATE.
- ALL
- Retira filtros: ALL(Ventas[Ciudad]) ignora el filtro de ciudad — la clave de los «% del total».
Ejemplo sencillo: Zineb calcula las ventas de todas las ciudades para comparar cada ciudad con el total.
Lo que no es: un filtro que permanece activo y falsea la cuota.
Reflejo: % del total → ALL sobre la columna.
- VAR / RETURN
- Las variables DAX: se nombra un cálculo intermedio una vez y luego se devuelve con RETURN.
Ejemplo sencillo: Zineb escribe VAR Total = ... RETURN DIVIDE([Total Ventas], Total).
Lo que no es: un mismo cálculo repetido tres veces en una fórmula.
Reflejo: más de una línea → VAR/RETURN.
- Transición de contexto
- El mecanismo avanzado por el cual CALCULATE transforma un contexto de fila en contexto de filtro.
Ejemplo sencillo: Zineb sabe nombrarlo y cuenta con profundizarlo con la referencia SQLBI.
Lo que no es: el simple contexto de filtro de una celda de visual.
Reflejo: conocerlo de nombre, profundizarlo más adelante.
En la práctica — En la práctica — El «% del total» diseccionado
- Cree una matriz Ciudad × [Total Ventas] y LEA cada celda enunciando su contexto: «esta celda = ventas filtradas por Lyon», como Zineb.
- Escriba Ventas Todas Ciudades = CALCULATE([Total Ventas], ALL(Ventas[Ciudad])) y añádala a la matriz: el mismo valor en todas partes (el filtro de ciudad queda retirado).
- Compóngala con variables: Cuota ciudad = VAR Total = CALCULATE([Total Ventas], ALL(Ventas[Ciudad])) RETURN DIVIDE([Total Ventas], Total), y luego formatéela en %.
- Pruébela con un segmentador Comercial activo: la cuota se recalcula DENTRO del ámbito del segmentador — relea la fórmula hasta poder explicar por qué.
Guion paso a paso — leer un contexto como Zineb (8 min)
1) Muestre [Total Ventas] en matriz, Ciudad en filas y Mes en columnas. 2) Haga clic en una celda y pronuncie su contexto: el cruce de los dos filtros activos. 3) Cree Ventas Todas Ciudades = CALCULATE([Total Ventas], ALL(Ventas[Ciudad])): compruebe que el valor es idéntico en todas las filas. 4) Cree Cuota ciudad con VAR/RETURN: VAR Total = CALCULATE([Total Ventas], ALL(Ventas[Ciudad])) RETURN DIVIDE([Total Ventas], Total), formateada en %. 5) Aplique un segmentador Comercial: observe la cuota recalcularse dentro del ámbito, y explíquelo en voz alta.
Si un total parece falso, vuelva al punto 2: en nueve de cada diez casos, es el contexto el que explica el resultado.
Plantilla copiar-pegar — mis medidas de contexto
Ventas Todas Ciudades = CALCULATE([Total Ventas], ALL(Ventas[Ciudad]))
Cuota ciudad =
VAR Total = CALCULATE([Total Ventas], ALL(Ventas[Ciudad]))
RETURN DIVIDE([Total Ventas], Total) // %
Regla: leer el contexto → modificarlo (CALCULATE/ALL) → estructurar (VAR/RETURN).
Cuota del total
Zineb muestra la cuota de cada ciudad en las ventas globales: el combo CALCULATE + ALL + VAR, formateado en %.
Total de todas las ciudades
Zineb aísla el gran total con ALL(Ventas[Ciudad]): el mismo valor repetido en cada fila, una referencia constante.
Diagnóstico de una celda
Un resultado dudoso: Zineb lee el contexto en voz alta antes de tocar la medida — el error suele estar ahí.
Fórmula legible
Una medida de cinco líneas se vuelve clara gracias a VAR: el cálculo nombrado una vez, RETURN al final.
✓ Buenas prácticas
- Leer el contexto de una celda en voz alta para comprender un resultado.
- Usar VAR/RETURN sistemáticamente en cuanto una fórmula supere una línea.
- Comenzar todo diagnóstico por el contexto de filtro.
✗ Errores frecuentes
- Escribir CALCULATE anidados ilegibles sin variables.
- Confundir ALL (retira todo) con ALLSELECTED (respeta los segmentadores).
- Buscar un error en otro sitio que en el contexto.
Puntos clave
- Cada celda de visual tiene su contexto de filtro: léalo en voz alta para comprender un resultado.
- CALCULATE añade/sobrescribe filtros; ALL los retira: los dos gestos cubren lo esencial de las necesidades.
- VAR/RETURN sistemáticos en cuanto una fórmula supere una línea: legibilidad Y rendimiento.
- Un resultado DAX «raro» = un contexto mal comprendido: el diagnóstico empieza siempre ahí.
Reto de 48 h — aplíquelo mañana
Reproduzca la matriz de Zineb: [Total Ventas] por Ciudad, y luego añada CALCULATE([Total Ventas], ALL(Ventas[Ciudad])) y la medida Cuota ciudad construida con VAR/RETURN. Escriba en una frase por qué la cuota se recalcula cuando se aplica un segmentador.
- Sé leer el contexto de filtro de una celda de visual.
- Sé escribir el % del total con CALCULATE + ALL + VAR.
- Diagnostico un resultado DAX partiendo del contexto.
Preguntas frecuentes
¿ALL, ALLSELECTED, ALLEXCEPT: cómo orientarse?
ALL retira todo filtro sobre el destino (el gran total); ALLSELECTED respeta las selecciones externas, como los segmentadores; ALLEXCEPT retira todo salvo las columnas citadas. Empiece por ALL, pase a ALLSELECTED cuando el % deba seguir a los segmentadores, y guarde ALLEXCEPT para más adelante — los casos finos se aclaran con la práctica y la referencia SQLBI.
¿Por qué mi medida es correcta en el detalle pero falsa en la fila Total?
Porque la fila Total tiene un contexto más amplio: no hay ningún filtro de ciudad activo ahí. Una medida mal construida se degrada allí — el caso clásico es la media de ratios. La solución habitual es recalcular por iteración con SUMX en lugar de promediar un resultado ya agregado. Reflejo: correcto en el detalle, falso en el total → sospeche de un ratio mal colocado.
¿Para qué sirve ALL en CALCULATE?