Fundamentos de DAX
DAX (Data Analysis Expressions) es el lenguaje de fórmulas de Power BI. Con DAX creas medidas, columnas calculadas y tablas calculadas que potencian tus análisis.
¿Qué es DAX?
DAX es un lenguaje funcional diseñado para trabajar con modelos de datos tabulares. Se parece a las fórmulas de Excel pero opera sobre tablas y relaciones, no sobre celdas individuales.
// Esto NO es DAX:
=A1+B1
// Esto SÍ es DAX:
Total Ventas = SUM(Ventas[Monto])
Medidas vs Columnas Calculadas
| Concepto | Cuándo se calcula | Almacenamiento | Uso principal |
|---|---|---|---|
| Medida | En tiempo de consulta | No ocupa espacio | KPIs, totales, promedios |
| Columna calculada | Al refrescar datos | Ocupa espacio en RAM | Categorías, flags, texto |
Regla general: si el valor depende del contexto de filtro (el usuario filtra por año, producto, etc.), usa una medida. Si es un atributo fijo por fila, usa una columna calculada.
Funciones de agregación básicas
Total Ventas = SUM(Ventas[Monto])
Cantidad Total = COUNT(Ventas[ID])
Cantidad Productos = DISTINCTCOUNT(Ventas[ProductoID])
Promedio Venta = AVERAGE(Ventas[Monto])
Venta Máxima = MAX(Ventas[Monto])
Venta Mínima = MIN(Ventas[Monto])
CALCULATE: la función más importante
CALCULATE evalúa una expresión en un contexto de filtro modificado. Es la función más poderosa e importante de DAX.
// Ventas totales (respeta los filtros del reporte)
Total Ventas = SUM(Ventas[Monto])
// Ventas solo de 2025 (ignora el filtro de año del reporte)
Ventas 2025 =
CALCULATE(
SUM(Ventas[Monto]),
Calendario[Año] = 2025
)
// Ventas de la categoría "Electrónica" sin importar qué filtre el usuario
Ventas Electrónica =
CALCULATE(
SUM(Ventas[Monto]),
Productos[Categoría] = "Electrónica"
)
Contexto de evaluación
Contexto de fila (Row Context)
Existe en columnas calculadas e iteradores. Evalúa fila por fila.
// Columna calculada: cada fila tiene su propio contexto
Ganancia = Ventas[Precio] - Ventas[Costo]
Contexto de filtro (Filter Context)
Es el conjunto de filtros activos en un momento dado. Viene de:
- Filtros del reporte.
- Slicers (segmentadores).
- Filtros de visualización.
- La función
CALCULATE.
// Si el usuario filtra por "México" y "2025",
// esta medida solo suma las ventas de México en 2025
Total Ventas = SUM(Ventas[Monto])
Funciones lógicas
// IF
Estado = IF(Ventas[Monto] > 10000, "Alto", "Normal")
// SWITCH (mejor que IF anidados)
Categoría Monto =
SWITCH(TRUE(),
Ventas[Monto] >= 50000, "Premium",
Ventas[Monto] >= 10000, "Alto",
Ventas[Monto] >= 5000, "Medio",
"Bajo"
)
// AND, OR
EsVentaGrande = AND(Ventas[Monto] > 10000, Ventas[Cantidad] > 50)
Funciones de texto
Nombre Completo = Clientes[Nombre] & " " & Clientes[Apellido]
Código = LEFT(Productos[SKU], 3)
Categoría Limpia = TRIM(UPPER(Productos[Categoría]))
Funciones de fecha
Antiguedad Días = DATEDIFF(Clientes[FechaRegistro], TODAY(), DAY)
Mes Actual = FORMAT(TODAY(), "MMMM YYYY")
Variables (VAR)
Las variables hacen tu código más legible y eficiente:
Margen % =
VAR Ingresos = SUM(Ventas[Monto])
VAR Costos = SUM(Ventas[Costo])
VAR Ganancia = Ingresos - Costos
RETURN
DIVIDE(Ganancia, Ingresos, 0)
VAR se evalúa una sola vez — si usas el mismo cálculo varias veces, ponlo en una variable.
DIVIDE vs el operador /
// ❌ Puede dar error de división por cero
Margen = (Ventas - Costo) / Ventas
// ✅ Maneja la división por cero limpiamente
Margen = DIVIDE(Ventas - Costo, Ventas, 0)
DIVIDE acepta un tercer argumento como valor por defecto cuando el denominador es 0 o BLANK.
Resumen
DAX es el lenguaje de fórmulas de Power BI. Las medidas se evalúan dinámicamente según el contexto de filtro, mientras las columnas calculadas se evalúan fila por fila. CALCULATE modifica el contexto de filtro y es la función más importante. Usa VAR para código más limpio y DIVIDE para divisiones seguras.