DAX avanzado: medidas dinámicas con CALCULATE y FILTER para análisis temporal

DAX avanzado: medidas dinámicas con CALCULATE y FILTER para análisis temporal

Juan Gabriel Gomila Juan Gabriel Gomila
16 minutos

Leer el artículo
Audio generated by DropInBlog's Blog Voice AI™ may have slight pronunciation nuances. Learn more

Contenidos

Cuando trabajas con Power BI, llega un momento en el que las sumas, promedios y recuentos básicos dejan de ser suficientes. El verdadero potencial del modelo aparece cuando necesitas que una medida cambie su comportamiento en función del periodo seleccionado, compare fechas, ignore determinados filtros o calcule resultados sobre conjuntos de datos que no existen de forma explícita en ninguna tabla. Ahí es donde entra en juego el DAX avanzado y, especialmente, dos de sus funciones más importantes: CALCULATE y FILTER. Combinadas correctamente con una tabla de calendario y con medidas bien diseñadas, permiten construir análisis temporales dinámicos, reutilizables y mucho más sofisticados.

En este artículo vas a ver cómo funcionan, qué papel desempeña el contexto de filtro y cómo puedes utilizarlas para crear medidas temporales capaces de responder a las selecciones realizadas por el usuario en un informe de Power BI.

Por qué CALCULATE es fundamental en DAX avanzado

Para comprender buena parte del DAX avanzado, primero tienes que entender CALCULATE. Su función principal consiste en evaluar una expresión modificando el contexto de filtro en el que se ejecuta.

Su estructura básica es:

CALCULATE(
    <expresión>,
    <filtro1>,
    <filtro2>,
    ...
)

Imagina que tienes una tabla llamada Ventas y una medida básica:

Ventas Totales =
SUM(Ventas[Importe])

La medida devuelve una cantidad diferente dependiendo del contexto. Si colocas el año en las filas de una matriz, Power BI evaluará Ventas Totales para cada año. Si además seleccionas una región mediante un segmentador, ese filtro también afectará al resultado.

Ahora puedes crear una medida que solo tenga en cuenta las ventas del canal online:

Ventas Online =
CALCULATE(
    [Ventas Totales],
    Ventas[Canal] = "Online"
)

CALCULATE toma la medida original y modifica su contexto para incorporar el filtro correspondiente.

Este principio parece sencillo, pero es la base de una enorme cantidad de cálculos complejos.

El contexto de filtro: la clave para entender las medidas dinámicas

Una medida DAX no tiene un resultado fijo. Su valor depende del contexto en el que Power BI la evalúa.

Supongamos que una visualización muestra:

  • Año.
  • Categoría de producto.
  • Ventas totales.

Cada celda de la visualización genera un contexto diferente. Una fila correspondiente a 2025 y a la categoría "Tecnología", por ejemplo, obliga a la medida a calcular únicamente las ventas que cumplen ambas condiciones.

Los segmentadores, filtros de página, filtros de informe y relaciones entre tablas también intervienen en ese contexto.

Por eso aprender DAX avanzado no consiste únicamente en memorizar funciones. Lo importante es comprender cómo una función modifica, conserva o elimina filtros.

CALCULATE resulta especialmente poderosa porque permite intervenir directamente en ese mecanismo.

FILTER: construir filtros más sofisticados

Hay situaciones en las que un filtro sencillo dentro de CALCULATE es suficiente:

Ventas España =
CALCULATE(
    [Ventas Totales],
    Clientes[Pais] = "España"
)

Sin embargo, otras condiciones necesitan evaluar una expresión fila a fila. Para esos escenarios puedes utilizar FILTER.

Su sintaxis general es:

FILTER(
    <tabla>,
    <condición>
)

Por ejemplo:

Ventas Importes Altos =
CALCULATE(
    [Ventas Totales],
    FILTER(
        Ventas,
        Ventas[Importe] > 1000
    )
)

FILTER devuelve una tabla formada únicamente por las filas que cumplen la condición. Posteriormente, CALCULATE utiliza ese conjunto como parte del nuevo contexto.

Una regla práctica es evitar FILTER cuando puedes expresar directamente una condición sencilla en CALCULATE. Utilizarlo indiscriminadamente puede complicar las medidas y, en determinados modelos, perjudicar su rendimiento.

La tabla calendario como base del análisis temporal

Si quieres trabajar seriamente con DAX avanzado aplicado al tiempo, deberías disponer de una tabla calendario independiente.

Una estructura básica podría contener columnas como:

Fecha
Año
Mes
Número de mes
Trimestre
Año-Mes

La tabla debe incluir una fila por cada fecha del periodo que quieras analizar y estar relacionada con la columna de fecha correspondiente de la tabla de hechos.

Por ejemplo:

Calendario[Fecha]  1 ---- *  Ventas[Fecha]

Esta estructura permite que los filtros aplicados sobre el calendario se propaguen correctamente hacia Ventas.

Además, conviene ordenar los nombres de los meses mediante una columna numérica. De lo contrario, Power BI podría mostrarlos alfabéticamente en lugar de hacerlo de enero a diciembre.

Una tabla calendario consistente hace que las medidas sean más fáciles de interpretar y evita numerosos problemas cuando empiezas a comparar periodos.

Ventas acumuladas hasta la fecha seleccionada

Uno de los ejemplos más útiles consiste en calcular las ventas acumuladas hasta la fecha visible en el contexto.

Puedes crear una medida como esta:

Ventas Acumuladas =
VAR FechaActual =
    MAX(Calendario[Fecha])
RETURN
    CALCULATE(
        [Ventas Totales],
        FILTER(
            ALL(Calendario[Fecha]),
            Calendario[Fecha] <= FechaActual
        )
    )

Aquí aparecen varios conceptos importantes.

Primero, MAX(Calendario[Fecha]) obtiene la fecha máxima del contexto actual. Después, ALL elimina el filtro existente sobre la columna de fecha. Finalmente, FILTER construye un nuevo conjunto que contiene todas las fechas anteriores o iguales a FechaActual.

El resultado es un acumulado dinámico.

Si una visualización llega hasta junio, la medida acumulará hasta junio. Si el usuario cambia la selección y llega hasta septiembre, el cálculo responderá automáticamente.

Este patrón demuestra por qué el DAX avanzado resulta tan útil: no necesitas almacenar físicamente cada posible acumulado en el modelo.

Acumulado anual sin mezclar ejercicios

La medida anterior requiere especial atención cuando existen varios años. Dependiendo de la visualización y de los filtros utilizados, puedes necesitar limitar explícitamente el cálculo al ejercicio correspondiente.

Una posible solución es:

Ventas Acumuladas Año =
VAR FechaActual =
    MAX(Calendario[Fecha])
VAR AñoActual =
    MAX(Calendario[Año])
RETURN
    CALCULATE(
        [Ventas Totales],
        FILTER(
            ALL(Calendario),
            Calendario[Año] = AñoActual
                && Calendario[Fecha] <= FechaActual
        )
    )

Ahora FILTER impone dos condiciones: la fecha tiene que ser anterior o igual a la fecha actual y, además, debe pertenecer al mismo año.

Este tipo de patrón resulta especialmente interesante cuando quieres entender exactamente qué filtros se eliminan y cuáles vuelves a aplicar.

No obstante, DAX también dispone de funciones específicas de inteligencia temporal que pueden resolver determinados acumulados con menos código. La elección dependerá de las características del calendario, de la lógica empresarial y del control que necesites sobre el cálculo.

Comparar el periodo actual con el anterior

Otro requisito habitual consiste en comparar un periodo con otro.

Si dispones de una tabla calendario correctamente configurada, puedes crear una medida para recuperar las ventas del año anterior:

Ventas Año Anterior =
CALCULATE(
    [Ventas Totales],
    SAMEPERIODLASTYEAR(Calendario[Fecha])
)

A continuación, puedes calcular la diferencia:

Variación Ventas =
[Ventas Totales] - [Ventas Año Anterior]

Y también la variación porcentual:

Variación Ventas % =
DIVIDE(
    [Ventas Totales] - [Ventas Año Anterior],
    [Ventas Año Anterior]
)

Utilizar DIVIDE suele ser preferible a realizar una división mediante /, ya que gestiona de forma más segura los casos en los que el denominador es cero o está vacío.

Aquí puedes observar otra característica del DAX avanzado: una medida compleja no tiene por qué estar formada por una única expresión gigantesca. Es preferible crear medidas base claras y combinarlas después.

Ventanas temporales dinámicas con FILTER

Supongamos ahora que quieres calcular las ventas correspondientes a los últimos 30 días respecto a la fecha máxima seleccionada.

Puedes utilizar:

Ventas Últimos 30 Días =
VAR FechaFin =
    MAX(Calendario[Fecha])
VAR FechaInicio =
    FechaFin - 29
RETURN
    CALCULATE(
        [Ventas Totales],
        FILTER(
            ALL(Calendario[Fecha]),
            Calendario[Fecha] >= FechaInicio
                && Calendario[Fecha] <= FechaFin
        )
    )

La medida construye una ventana móvil entre FechaInicio y FechaFin.

El concepto puede adaptarse a otras necesidades: últimos 7 días, 90 días, 12 meses o cualquier intervalo definido por tu lógica de negocio.

Incluso podrías incorporar una tabla desconectada que permita al usuario seleccionar el tamaño de la ventana desde un segmentador y recuperar la selección mediante SELECTEDVALUE.

De esta manera, una única medida puede responder a diferentes escenarios sin tener que crear una versión independiente para cada intervalo.

Medidas dinámicas controladas por el usuario

Una aplicación especialmente interesante del DAX avanzado consiste en permitir que el usuario decida qué indicador quiere analizar.

Imagina una tabla desconectada llamada SelectorMetrica con estos valores:

Ventas
Margen
Unidades

Puedes recuperar la opción elegida:

Métrica Seleccionada =
VAR Seleccion =
    SELECTEDVALUE(
        SelectorMetrica[Metrica],
        "Ventas"
    )
RETURN
    SWITCH(
        Seleccion,
        "Ventas", [Ventas Totales],
        "Margen", [Margen Total],
        "Unidades", [Unidades Totales]
    )

Esta medida puede utilizarse después dentro de otros cálculos temporales.

Así puedes construir una visualización en la que el usuario elija "Ventas", "Margen" o "Unidades" y mantenga las mismas comparaciones temporales sin duplicar toda la lógica del informe.

Es una técnica muy útil para reducir el número de visualizaciones y crear páginas más interactivas.

CALCULATE, FILTER y ALL: una combinación que debes dominar

Cuando empiezas a construir medidas temporales complejas, encontrarás frecuentemente estas tres funciones juntas.

CALCULATE modifica el contexto de evaluación.

FILTER genera un conjunto de filas según una condición.

ALL elimina determinados filtros existentes.

Por ejemplo:

Ventas Hasta Fecha =
VAR FechaLimite =
    MAX(Calendario[Fecha])
RETURN
    CALCULATE(
        [Ventas Totales],
        FILTER(
            ALL(Calendario),
            Calendario[Fecha] <= FechaLimite
        )
    )

Pero aquí debes tener cuidado. ALL(Calendario) elimina los filtros de toda la tabla calendario, no únicamente el de fecha. Eso puede afectar también a filtros sobre año, trimestre o mes.

Si solo necesitas eliminar un filtro concreto, puede ser más apropiado trabajar sobre la columna correspondiente:

ALL(Calendario[Fecha])

Entender esta diferencia es esencial para desarrollar DAX avanzado fiable. Muchas medidas que aparentemente "funcionan mal" no tienen un problema matemático: simplemente están eliminando más filtros de los necesarios.

Utiliza variables para mejorar las medidas

Las variables con VAR permiten guardar resultados intermedios y hacen que las expresiones sean más fáciles de leer.

En lugar de escribir varias veces:

MAX(Calendario[Fecha])

puedes almacenar el resultado:

VAR FechaActual =
    MAX(Calendario[Fecha])

y utilizar después FechaActual.

Una estructura habitual sería:

Mi Medida =
VAR FechaActual =
    MAX(Calendario[Fecha])
VAR AñoActual =
    YEAR(FechaActual)
VAR Resultado =
    CALCULATE(
        [Ventas Totales],
        ...
    )
RETURN
    Resultado

Además de facilitar el mantenimiento, las variables permiten inspeccionar mejor la lógica durante el desarrollo. Cuando una medida contiene múltiples condiciones temporales, esta claridad resulta especialmente valiosa.

Errores frecuentes al trabajar con análisis temporal

Aprender DAX avanzado implica también reconocer algunos errores recurrentes. Uno de los más habituales es utilizar directamente las fechas de la tabla de ventas para todos los cálculos en lugar de crear una dimensión de calendario adecuada.

Otro problema frecuente consiste en eliminar filtros de forma demasiado agresiva. Utilizar ALL sobre una tabla completa puede cambiar más elementos del contexto de los que pretendías.

También conviene evitar medidas excesivamente largas. Si una expresión calcula ventas, margen, comparaciones temporales y porcentajes simultáneamente, probablemente sea mejor dividir la lógica en medidas más pequeñas.

Por último, presta atención a los totales. En DAX, el total de una matriz no siempre equivale a sumar los resultados visibles de sus filas. Power BI vuelve a evaluar la medida en el contexto correspondiente al total. Si una expresión depende de MAX, SELECTEDVALUE o condiciones específicas, el resultado agregado puede sorprenderte aunque sea coherente con la lógica de evaluación.

Rendimiento: FILTER no siempre es la mejor opción

FILTER es extremadamente útil, pero eso no significa que debas introducirlo en todas las medidas.

Por ejemplo, si necesitas aplicar una condición sencilla:

CALCULATE(
    [Ventas Totales],
    Productos[Categoria] = "Tecnología"
)

normalmente no necesitas escribir:

CALCULATE(
    [Ventas Totales],
    FILTER(
        Productos,
        Productos[Categoria] = "Tecnología"
    )
)

La primera versión expresa mejor la intención y evita introducir complejidad innecesaria.

Reserva FILTER para situaciones en las que realmente necesites evaluar una expresión sobre una tabla o construir condiciones que no puedan representarse adecuadamente mediante filtros simples.

En modelos con millones de registros, estas decisiones pueden adquirir una importancia considerable.

Cómo estructurar tus medidas para que el modelo sea mantenible

Una buena práctica al trabajar con DAX avanzado consiste en desarrollar las medidas por capas.

Primero puedes definir las medidas base:

Ventas Totales =
SUM(Ventas[Importe])

Coste Total =
SUM(Ventas[Coste])

Margen Total =
[Ventas Totales] - [Coste Total]

Después, construyes las medidas temporales reutilizando las anteriores:

Ventas Año Anterior =
CALCULATE(
    [Ventas Totales],
    SAMEPERIODLASTYEAR(Calendario[Fecha])
)

Y finalmente desarrollas indicadores derivados:

Crecimiento % =
DIVIDE(
    [Ventas Totales] - [Ventas Año Anterior],
    [Ventas Año Anterior]
)

Este enfoque tiene varias ventajas. Si cambia la definición de Ventas Totales, solo necesitas modificar una medida. Todas las expresiones dependientes heredarán automáticamente la nueva lógica.

También resulta mucho más fácil comprobar resultados y detectar dónde se encuentra un posible error.

De las medidas estáticas al análisis realmente dinámico

La diferencia entre un informe básico y un modelo analítico potente no está en acumular decenas de visualizaciones, sino en conseguir que unas pocas medidas respondan correctamente a contextos diferentes.

CALCULATE proporciona el mecanismo para modificar esos contextos. FILTER permite construir subconjuntos dinámicos de datos. La tabla calendario aporta una dimensión temporal coherente y funciones como ALL, SELECTEDVALUE, SWITCHo SAMEPERIODLASTYEAR amplían las posibilidades.

Cuando dominas estas piezas, puedes crear acumulados, periodos móviles, comparaciones interanuales, métricas seleccionables y numerosos indicadores sin almacenar previamente cada resultado posible.

El objetivo al aprender DAX avanzado no debería ser escribir fórmulas cada vez más complicadas. Debería ser comprender con precisión qué contexto recibe una medida, qué filtros necesitas conservar, cuáles debes modificar y qué conjunto de datos quieres que se evalúe finalmente.

Si interiorizas esa lógica, CALCULATE y FILTER dejan de parecer funciones difíciles y se convierten en herramientas con las que puedes diseñar análisis temporales flexibles, escalables y mucho más fáciles de mantener en Power BI.

Aprende sobre Business Intelligence con la Ruta de Frogames Formación

Si te ha interesado lo que te hemos contado en este post, te encantará saber que puedes profundizar en este tema y en todas las habilidades relacionadas con Business Intelligence a través de la ruta de aprendizaje de Frogames Formación.

Esta ruta está diseñada para quienes quieren empezar desde cero y avanzar con paso firme, aprendiendo de forma práctica y sencilla todo lo necesario para dominar el mundo del BI, desde la extracción y transformación de datos, creación de dashboards y análisis de KPIs, hasta el uso de herramientas avanzadas como Power BI, Tableau o SQL para la toma de decisiones basada en datos.

Además, la Ruta de Business Intelligence de Frogames Formación abarca diferentes módulos que cubren desde los fundamentos esenciales hasta técnicas avanzadas de análisis y visualización, para que podáis aplicar vuestros conocimientos en proyectos reales con confianza y profesionalidad.

Si queréis convertir el dominio del Business Intelligence en una de vuestras principales competencias y descubrir cómo transformar datos en información estratégica para las organizaciones, esta ruta formativa es la opción perfecta para vosotros. ¡No dejéis pasar la oportunidad de mejorar vuestras habilidades y crecer profesionalmente!

Preguntas Frecuentes

¿Qué es CALCULATE en DAX?

CALCULATE permite evaluar una medida modificando el contexto de filtro, por lo que es fundamental para crear cálculos dinámicos en Power BI.

¿Para qué sirve FILTER en DAX?

FILTER devuelve una tabla con las filas que cumplen una condición concreta y se utiliza cuando necesitas aplicar filtros más complejos.

¿Por qué es importante una tabla calendario en Power BI?

Porque facilita los cálculos temporales, como acumulados, comparaciones interanuales, periodos móviles y análisis por meses, trimestres o años.

¿Cuándo conviene utilizar FILTER dentro de CALCULATE?

Cuando necesitas evaluar condiciones complejas fila a fila. Para filtros sencillos, suele ser mejor aplicar la condición directamente en CALCULATE.

¿Qué ventajas ofrece el DAX avanzado?

Permite crear medidas dinámicas, análisis temporales, comparativas y métricas interactivas adaptadas al contexto y a las selecciones del usuario.

« Volver al Blog