Saltar al contenido

Qué es DAX en Power BI: medidas vs columnas calculadas

Por · · Actualizado · 17 min de lectura · Leer en English
Compartir:

TL;DR — tabla de decisión antes de escribir una sola fórmula

PreguntaUsa esto
¿Necesito limpiar o transformar datos antes de cargarlos?Power Query (M)
¿Necesito calcular un KPI o métrica que cambie con filtros?Medida DAX
¿Necesito un valor por fila para filtrar o segmentar en slicers?Columna calculada DAX
¿Necesito un valor por fila para mostrar en una tabla o visual?Medida DAX (casi siempre)
¿La lógica depende de otras filas de la misma tabla?Medida DAX con CALCULATE/FILTER
¿El resultado va a usarse como clave en una relación?Columna calculada DAX

Si no sabes qué elegir, empieza por medida. Es más fácil de cambiar y consume menos memoria.


¿Qué es DAX y por qué existe?

DAX (Data Analysis Expressions) es el lenguaje de fórmulas de Power BI para calcular métricas sobre modelos de datos relacionales. Funciona también en Power Pivot, SQL Server Analysis Services Tabular y Azure Analysis Services.

La diferencia con Excel no es la sintaxis (que es similar), sino el modelo de ejecución: DAX opera sobre columnas enteras y responde dinámicamente al contexto de filtro — el conjunto de filtros activos en cada momento del informe. Eso es lo que hace que SUM(Ventas[Importe]) devuelva un número diferente según el año o la categoría seleccionada, sin que tú escribas ninguna condición.

-- En Excel:       =SUMA(A1:A10)
-- En DAX (medida):  Total Ventas = SUM(Ventas[Importe])

Parecen iguales. La diferencia es que la medida DAX responde automáticamente a cualquier filtro del informe.


¿DAX o Power Query? La confusión más común

En Power BI las medidas DAX se crean desde "Nueva medida" en el panel de campos

El Editor de Power Query se abre desde la cinta; la barra de fórmulas DAX edita medidas como AVERAGE(Operaciones[Dias tenencia])

Power Query (M)DAX
Para quéTransformar y limpiar datosCalcular métricas y KPIs
Cuándo se ejecutaAl cargar o refrescar datosAl renderizar cada visual del informe
Dónde lo usasEditor de Power QueryPanel de medidas y columnas calculadas
Analogía ExcelPower Query de ExcelFórmulas en celdas
Afecta al modeloSí (cambia filas y columnas)No (solo agrega cálculos encima)

La regla de separación

Power Query: todo lo que ocurre antes de que los datos entren al modelo.

  • Convertir tipos (texto → fecha)
  • Limpiar nombres de columnas
  • Combinar tablas (merge/append)
  • Filtrar filas que no necesitas

DAX: todo lo que calculas después.

  • Totales, promedios, conteos
  • Comparaciones temporales (vs año anterior, vs presupuesto)
  • Porcentajes y ratios
  • KPIs de negocio

Ejemplo práctico: tienes una columna “Fecha” en formato texto → Power Query para convertirla a fecha real. Quieres calcular ventas del mes anterior → DAX para crear la medida.


Medidas vs Columnas calculadas: por qué importa la memoria

Esta es la decisión más importante que tomarás en DAX y la que más impacto tiene en el rendimiento del modelo.

Medidas DAX: no existen en memoria hasta que una visual las solicita. Se calculan al vuelo en función del contexto de filtro activo y desaparecen cuando la visual se cierra.

Total Ventas = SUM(Ventas[Importe])

Columnas calculadas: se materializan fila a fila durante el refresco de datos y se almacenan en memoria comprimida por VertiPaq. Ocupan espacio real en el modelo — espacio que VertiPaq tiene que comprimir, mantener en RAM y actualizar en cada refresco.

Margen = Ventas[Importe] - Ventas[Coste]

El motivo por el que las columnas calculadas consumen más recursos tiene que ver con cómo VertiPaq almacena los datos: trabaja por columnas y usa compresión de diccionario. Añadir una columna calculada añade una columna entera al motor de almacenamiento. Si esa columna tiene alta cardinalidad (muchos valores únicos), la compresión es baja y el consumo de memoria sube de forma notable. Los detalles sobre cómo VertiPaq comprime y por qué la cardinalidad importa están en el post sobre compresión VertiPaq y optimización de modelos.

La regla de oro

Usa medidas siempre que puedas. Recurre a columnas calculadas solo cuando:

  • Necesitas el valor para filtrar o segmentar (slicers)
  • El cálculo depende de valores de la misma fila (acceso a columnas vecinas)
  • Necesitas usar el resultado en una relación entre tablas

¿Cómo funciona el contexto de filtro?

El contexto de filtro es el conjunto de condiciones que determinan qué filas se incluyen en un cálculo DAX. Es lo que hace que la misma medida devuelva valores distintos en cada celda de una tabla o en cada segmento de un gráfico.

Cuando colocas [Total Ventas] en un gráfico de barras por categoría de producto, DAX evalúa esa medida una vez por cada categoría — con el filtro de esa categoría activo. No hay ningún bucle explícito en tu código: el motor lo gestiona.

Total Ventas = SUM(Ventas[Importe])
-- Devuelve diferente valor en cada celda de la tabla
-- según los filtros activos en ese punto del informe

El error más común de principiante es asumir que una medida siempre devuelve el mismo número. Si el resultado te parece incorrecto, el 80% de las veces el problema está en el contexto de filtro — filtros de página, de visual, o de relaciones que propagan filtros inesperadamente. El proceso para diagnosticarlo está en la guía de debugging de Power BI.

CALCULATE es la función que te permite modificar explícitamente ese contexto dentro de una medida.


Las 5 funciones DAX que necesitas dominar

No necesitas conocer las 200+ funciones de DAX. Con estas 5 categorías cubres el 80% de los casos.

1. Agregaciones: SUM, AVERAGE, COUNT

Total Ventas    = SUM(Ventas[Importe])
Precio Medio    = AVERAGE(Productos[Precio])
Pedidos         = COUNT(Ventas[PedidoID])
Clientes únicos = DISTINCTCOUNT(Ventas[ClienteID])

DISTINCTCOUNT cuenta valores únicos. Útil para contar clientes, productos, SKUs distintos.

2. CALCULATE: el núcleo de DAX

La función más importante. Evalúa una expresión con un contexto de filtro modificado.

-- Ventas totales ignorando el filtro de categoría activo
Ventas Todas Categorías =
CALCULATE(
    SUM(Ventas[Importe]),
    ALL(Productos[Categoría])
)

-- Ventas solo de 2025, independientemente del slicer de año
Ventas 2025 =
CALCULATE(
    SUM(Ventas[Importe]),
    Calendario[Año] = 2025
)

El flujo de CALCULATE es siempre: (1) toma la expresión, (2) aplica los filtros modificadores sobre el contexto actual, (3) evalúa la expresión en el nuevo contexto.

Una vez que dominas CALCULATE puedes construir patrones avanzados como las medidas rotativas para cambiar la métrica con un slicer sin añadir nuevas visualizaciones.

3. FILTER y ALL: control del contexto

ALL elimina filtros de una tabla o columna:

-- Porcentaje sobre el total general (ignora filtros de la visual)
% del Total =
DIVIDE(
    SUM(Ventas[Importe]),
    CALCULATE(SUM(Ventas[Importe]), ALL(Ventas))
)

FILTER aplica condiciones personalizadas devolviendo una tabla filtrada:

-- Ventas de productos premium (precio > 100)
Ventas Premium =
CALCULATE(
    SUM(Ventas[Importe]),
    FILTER(Productos, Productos[Precio] > 100)
)

4. IF y SWITCH: condicionales

IF para una condición:

Estado = IF(Ventas[Importe] > 1000, "Grande", "Pequeño")

SWITCH(TRUE(), …) para múltiples rangos (más limpio que IF anidados):

Segmento =
SWITCH(
    TRUE(),
    Ventas[Importe] > 10000, "Enterprise",
    Ventas[Importe] > 1000,  "Medium",
    Ventas[Importe] > 100,   "Small",
    "Micro"
)

SWITCH(TRUE(), ...) evalúa condiciones en orden y devuelve la primera que sea verdadera.

RELATED (de lado muchos a lado uno de la relación):

-- En tabla Ventas, traer la categoría del producto relacionado
Categoría = RELATED(Productos[Categoría])

RELATEDTABLE (de lado uno a lado muchos):

-- En tabla Clientes, contar sus pedidos
Pedidos del Cliente = COUNTROWS(RELATEDTABLE(Ventas))

3 medidas DAX que necesitas desde el día uno

Medida 1: Total Ventas

Total Ventas = SUM(Ventas[Importe])

Suma todos los importes. Si hay un filtro de fecha activo en el informe, solo suma ese periodo.

Medida 2: Ventas del año anterior

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

Desplaza el contexto de filtro de fechas al mismo periodo del año anterior.

Buena práctica: usa una tabla de calendario dedicada (una dimensión de fechas completa y contigua, sin huecos) relacionada con tu tabla de hechos, y márcala como “Date table”. Por defecto Power BI activa Auto date/time, que crea tablas de fecha ocultas y hace que SAMEPERIODLASTYEAR funcione sin más — pero engorda el modelo y te quita control. Sin una tabla de fechas contigua, el time intelligence puede devolver blanco o lanzar el error “only works with contiguous date selections” cuando las fechas tienen huecos.

Medida 3: Porcentaje del total

% del Total =
DIVIDE(
    [Total Ventas],
    CALCULATE([Total Ventas], ALL(Ventas)),
    0
)

ALL(Ventas) elimina todos los filtros de la tabla Ventas para calcular el denominador. El tercer argumento de DIVIDE (0) se devuelve si el denominador es cero.

Por qué DIVIDE y no /:

-- ❌ Error en runtime si Objetivo = 0
Ratio = [Ventas] / [Objetivo]

-- ✅ Devuelve 0 (o lo que especifiques) si hay división por cero
Ratio = DIVIDE([Ventas], [Objetivo], 0)

Errores comunes y cómo evitarlos

Error 1: columnas calculadas para todo

Columnas calculadas mal usadas para lógica que debería ser una medida:

-- ❌ Columna calculada que intenta hacer un acumulado (incorrecto)
Total Acumulado =
CALCULATE(
    SUM(Ventas[Importe]),
    FILTER(ALL(Ventas), Ventas[Fecha] <= EARLIER(Ventas[Fecha]))
)
-- ✅ Medida correcta para un acumulado
Total Acumulado =
CALCULATE(
    [Total Ventas],
    FILTER(
        ALL(Calendario),
        Calendario[Fecha] <= MAX(Calendario[Fecha])
    )
)

Las columnas calculadas se evalúan fila a fila en el refresco. En tablas grandes, eso significa tiempo de refresco más largo y más memoria consumida.

Error 2: ignorar el contexto de filtro

El contexto de filtro determina qué filas entran en cada cálculo. Asumir que una medida devuelve siempre el mismo valor es el error más frecuente.

Si el resultado de una medida parece incorrecto, el primer paso es entender qué filtros están activos — de slicers, de página, de relaciones. El proceso completo de diagnóstico está en la guía de debugging de Power BI.

Error 3: dividir sin DIVIDE()

-- ❌ Produce un error de runtime si el denominador es 0
Cumplimiento = [Ventas] / [Objetivo]

-- ✅ Devuelve el valor alternativo (aquí 0) si hay división por cero
Cumplimiento = DIVIDE([Ventas], [Objetivo], 0)

Error 4: relaciones del modelo ignoradas

DAX opera sobre el modelo relacional. Si las tablas no están correctamente relacionadas, las medidas no propagan los filtros como esperas. Un problema frecuente es que Power BI desactiva relaciones sin avisar cuando hay ambigüedad.

Checklist mínimo antes de depurar una medida que da resultado extraño:

  • ¿Existe relación entre las tablas involucradas?
  • ¿Es 1 a muchos en la dirección correcta?
  • ¿Está activa (no discontinua en el diagrama)?

Error 5: complejidad innecesaria

-- ❌ Overcomplicated sin motivo
Total =
CALCULATE(
    SUMX(FILTER(Ventas, Ventas[Importe] > 0), Ventas[Importe])
)

-- ✅ Equivalente y más rápido
Total = SUM(Ventas[Importe])

Empieza simple. Añade CALCULATE, FILTER o SUMX solo cuando el caso lo exige.


DAX y Copilot: útil, pero con límites

Si tienes acceso a Power BI Copilot, puedes generar DAX con lenguaje natural:

Prompt: "Crea una medida que calcule las ventas del mismo periodo del año anterior"

Copilot genera código como:

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

Útil para el primer borrador. El problema es que Copilot no conoce tu modelo: puede generar nombres de tabla o columna incorrectos, y falla con frecuencia en patrones que involucran variables (VAR) o contextos de transición. Si no entiendes lo que genera, no podrás depurarlo cuando falle.


Cheat sheet de funciones DAX

FunciónPara qué
SUMSumar valores numéricos
AVERAGEPromedio
COUNT / COUNTAContar filas (numéricas / no vacías)
DISTINCTCOUNTContar valores únicos
CALCULATEModificar contexto de filtro
FILTERDevolver tabla filtrada
ALLEliminar filtros de tabla/columna
IFCondicional simple
SWITCHCondicional múltiple
DIVIDEDivisión segura (evita /0)
RELATEDTraer valor de tabla relacionada (lado 1)
RELATEDTABLETabla de filas relacionadas (lado muchos)
DATEADDDesplazar fechas N periodos
SAMEPERIODLASTYEARMismo periodo del año anterior
TOTALYTDAcumulado desde inicio de año
FORMATFormatear valores como texto

Recursos para seguir aprendiendo

DAX.do — Playground online para probar DAX sin instalar nada.

DAX Guide — Referencia completa de todas las funciones con ejemplos. Por SQLBI.

SQLBI — Marco Russo y Alberto Ferrari son la referencia en DAX. Sus artículos son técnicamente precisos.

“The Definitive Guide to DAX” (Marco Russo, Alberto Ferrari) — El libro. 700+ páginas. No es para principiantes totales, pero es la referencia cuando quieras ir más allá.

Canales YouTube: SQLBI (técnico), Guy in a Cube (más accesible), Curbal (contenido en español e inglés).


Por dónde empezar

Si estás empezando con DAX, primero asegúrate de tener las bases de la herramienta. Tenemos una guía completa para aprender Power BI gratis que cubre el entorno desde cero antes de meterte en fórmulas.

  1. Entiende la diferencia entre DAX y Power Query (ver tabla al inicio)
  2. Usa medidas, no columnas calculadas (salvo las tres excepciones listadas)
  3. Domina CALCULATE — es el 50% de DAX
  4. Usa DIVIDE() siempre para divisiones
  5. Cuando el resultado no cuadre, investiga el contexto de filtro primero

DAX tiene curva de aprendizaje, especialmente el contexto de filtro. Pero una vez que “haces clic”, puedes construir patrones avanzados: desde rolling 12 meses hasta medidas rotativas con slicer. Paso a paso.

Y recuerda: por muy perfecto que sea tu DAX, si nadie mira tu dashboard, algo falla en otro punto del proceso.


FAQ — Preguntas frecuentes sobre DAX

¿Cuál es la diferencia entre DAX y M (Power Query)?

DAX calcula métricas sobre datos ya cargados en el modelo. M transforma y limpia datos antes de que entren al modelo. No son intercambiables: cada uno tiene su momento de ejecución y propósito.

¿Cuándo usar una medida y cuándo una columna calculada?

Medida cuando el valor debe cambiar con los filtros del informe (KPIs, totales, ratios). Columna calculada cuando necesitas un valor fijo por fila para usarlo en slicers, relaciones o como input de otra columna.

¿Por qué mi medida devuelve el mismo número en todas las filas?

El valor no varía con el contexto porque usaste una columna calculada cuando debería ser una medida, o porque hay un ALL() o REMOVEFILTERS() que elimina los filtros activos. Revisa la lógica de CALCULATE en la medida.

¿Qué es el contexto de filtro en DAX?

Es el conjunto de condiciones que determinan qué filas incluye un cálculo en cada momento. Cuando colocas una medida en una tabla o gráfico, Power BI evalúa esa medida una vez por cada celda/segmento con el filtro de esa celda activo. CALCULATE permite modificar ese contexto desde dentro de la fórmula.

¿Por qué SAMEPERIODLASTYEAR no funciona en mi modelo?

Casi siempre por la tabla de fechas. El time intelligence necesita un calendario completo y contiguo (todos los días, sin huecos). Power BI lo disimula con Auto date/time (activado por defecto); en cuanto lo desactivas o usas directamente una columna de fechas con huecos, SAMEPERIODLASTYEAR devuelve blanco o lanza “only works with contiguous date selections”. Solución: crea una tabla de calendario dedicada, relaciónala y márcala como “Date table”.

¿DAX puede reemplazar a SQL?

No son equivalentes. DAX opera sobre el modelo tabular en memoria de VertiPaq. SQL opera sobre bases de datos relacionales con almacenamiento en disco. DAX es más rápido para análisis interactivo sobre datos ya cargados; SQL es más adecuado para extracciones, joins complejos y transformaciones antes de cargar.

¿Qué hace exactamente CALCULATE?

CALCULATE evalúa una expresión DAX con un contexto de filtro modificado. Toma los filtros activos en ese momento, aplica los modificadores que le pasas como argumentos (pueden añadir, eliminar o reemplazar filtros), y evalúa la expresión en ese nuevo contexto. Es la base de casi todos los patrones avanzados de DAX.

¿Las columnas calculadas ralentizan el refresco de datos?

Sí. Se materializan fila a fila durante el refresco. En tablas grandes, muchas columnas calculadas suman tiempo de procesamiento y aumentan el tamaño del modelo en memoria. Si la columna puede convertirse en medida, hazlo.

¿Te ha sido útil? Compártelo

Compartir:

Consultoría

¿Tienes un problema parecido con Power BI y DAX?

Puedo ayudarte. Cuéntame qué tienes y te doy un diagnóstico honesto — sin compromiso.

Ver consultoría →

También te puede interesar