FUNCIONES DE FILTRO Y CONTEXTO DE POWER BI
En Power BI, el lenguaje DAX, acrónimo de Data Analysis Expressions, no funciona como las fórmulas tradicionales de Excel. Cada cálculo se evalúa dentro de un contexto de evaluación. Comprender este concepto, especialmente el contexto de filtro y el contexto de fila, junto con las funciones que lo manipulan, es la clave para crear medidas potentes, dinámicas y correctas.¿Qué es el contexto en DAX?
El contexto de evaluación determina qué datos “ve” una fórmula en el momento de ejecutarse. Hay dos tipos principales:Contexto de filtro (Filter Context)
Es el conjunto de filtros activos que limitan las filas del modelo de datos sobre las que se realiza un cálculo.Se genera a partir de:
- Segmentadores
- Filtros del panel de filtros, como nivel visual, página o informe
- Campos en filas, columnas, ejes o leyendas de un visual
- Interacciones entre visuales, cross-filtering
- Funciones DAX como "CALCULATE"
Ejemplo simple
La medida "Total Ventas = SUM(Ventas[Importe])" mostrará un valor diferente según el país, año o producto seleccionado en el informe, porque el contexto de filtro cambia.Contexto de fila
Se produce cuando DAX evalúa una expresión fila por fila. Aparece en:- Columnas calculadas
- Funciones iteradoras, como "SUMX", "AVERAGEX", "FILTER", "ADDCOLUMNS", etc.
Transición de contexto
Es el mecanismo más importante de DAX. Ocurre cuando se usa "CALCULATE", o se referencia una medida, dentro de un contexto de fila. Convierte automáticamente los valores de la fila actual en filtros del contexto de filtro.La función estrella: CALCULATE
"CALCULATE" es la función más importante de DAX. Su trabajo principal es modificar el contexto de filtro antes de evaluar una expresión.Sintaxis
CALCULATE(
,
,
,
...
)
Ejemplos prácticos
// Ventas solo de España (reemplazar cualquier filtro de país)
Ventas España =
CALCULATE(
[Total Ventas],
Clientes[País] = "España"
)
// Porcentaje sobre el total (elimina filtros de producto)
% del Total =
DIVIDE(
[Total Ventas],
CALCULATE(
[Total Ventas],
ALL(Productos)
)
)
Principales funciones de filtro
Estas funciones se usan casi siempre dentro de "CALCULATE" o como argumentos de tabla:| Función | Qué hace | Ejemplo de uso típico |
|---|---|---|
| FILTER | Devuelve una tabla filtrada según una condición (crea contexto de fila) | Filtrar productos con ventas > 1000 |
| ALL | Elimina todos los filtros de una tabla o columna | Calcular totales generales |
| ALLEXCEPT | Elimina todos los filtros excepto los de las columnas indicadas | Totales por categoría manteniendo el producto |
| ALLSELECTED | Elimina filtros externos, pero respeta los de la selección actual del visual | Porcentajes respetando segmentadores |
| REMOVEFILTERS | Similar a ALL (más legible en versiones recientes) | Quitar filtros específicos |
| KEEPFILTERS | Conserva los filtros existentes en lugar de sobrescribirlos | Evitar que un filtro reemplace otro |
| VALUES / DISTINCT | Devuelve valores únicos de una columna en el contexto actual | Iterar solo valores visibles |
| RELATED / RELATEDTABLE | Accede a tablas relacionadas desde contexto de fila | Traer datos de tablas dimension |
Ejemplo
// Usando FILTER
Ventas Productos Caros =
CALCULATE(
[Total Ventas],
FILTER(
Productos,
Productos[Precio] > 100
)
)
// ALLEXCEPT
Ventas Total Categoría =
CALCULATE(
[Total Ventas],
ALLEXCEPT(Productos, Productos[Categoría])
)
// KEEPFILTERS (recomendado en muchos casos modernos)
Ventas Rojas =
CALCULATE(
[Total Ventas],
KEEPFILTERS(Productos[Color] = "Rojo")
)
Diferencias importantes y buenas prácticas
- "FILTER" vs predicados simples: "CALCULATE([Total], Productos[Color] = "Rojo")" es más eficiente que usar "FILTER" cuando es posible.DAX convierte internamente el predicado en un FILTER optimizado.
- Orden de evaluación: Primero se aplica el contexto de filtro → luego, si hay iteradores, el contexto de fila → y "CALCULATE" puede transformar uno en el otro.
- Evitar usar "FILTER" innecesariamente dentro de "CALCULATE" cuando un simple filtro de columna es suficiente (mejor rendimiento).
- "ALLSELECTED" es especialmente útil en informes interactivos donde se quieren porcentajes que respeten la selección del usuario, pero ignoren filtros de otros visuales.
Ejemplo completo de medida avanzada
% Ventas sobre Total Visible =
VAR VentasActuales = [Total Ventas]
VAR TotalVisible =
CALCULATE(
[Total Ventas],
ALLSELECTED(Productos)// Respeta la selección del usuario
)
RETURN
DIVIDE(VentasActuales, TotalVisible)
% Ventas sobre Total Visible =
VAR VentasActuales = [Total Ventas]
VAR TotalVisible =
CALCULATE(
[Total Ventas],
ALLSELECTED(Productos)// Respeta la selección del usuario
)
RETURN
DIVIDE(VentasActuales, TotalVisible)