2.4Introducción a DAX: SUM, AVERAGE, COUNT
Lo esencial en 30 segundos
- DAX = el lenguaje de cálculo de Power BI (el mismo que Power Pivot): se empieza por SUM, AVERAGE, COUNT/COUNTROWS, MIN, MAX.
- DIVIDE sustituye a «/» sistemáticamente: la división blindada, nunca más un error de división por cero.
- CALCULATE evalúa una expresión modificando el filtro — «las ventas, pero para París»; su dominio completo ocupa el nivel 3.
Mini-caso continuo — Zineb escribe su base de medidas
Zineb, controladora de gestión en una pyme agroalimentaria de Argel, quiere tres indicadores: la cifra de negocio, el número de ventas y el ticket medio. Escribe una base de medidas: Total Ventas = SUM(Ventas[Importe]), N.º Ventas = COUNTROWS(Ventas), y luego Ticket medio = DIVIDE([Total Ventas], [N.º Ventas]) — observando que una medida referencia a otra. Formatea cada una (€, separador de miles, decimales). Después domestica CALCULATE: Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París"), y Cuota París = DIVIDE([Ventas París], [Total Ventas]) formateada en %. Tres medidas que se encajan: Zineb ya escribe verdadero DAX.
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 2.4.
1. Las agregaciones básicas
El DAX (Data Analysis Expressions) es el lenguaje de cálculo de Power BI — el mismo que Power Pivot en Excel. Se empieza por las agregaciones simples: SUM, AVERAGE, COUNT/COUNTROWS, MIN, MAX, y DIVIDE — la división blindada que evita los errores de división por cero. Zineb anota la primera buena costumbre: las medidas se construyen como ladrillos, una medida puede (debe) referenciar otras.
2. Una primera visión de CALCULATE
Después, la función que lo cambia todo: CALCULATE, que evalúa una expresión modificando el filtro. «Las ventas, pero solo para París»: Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París"). Su dominio completo ocupa el nivel 3; aquí se domestica en un caso simple. Zineb se repite la frase: «calcula esto, con este filtro».
3. Nombrar y formatear
Buenas costumbres desde el primer día: nombrar con claridad cada medida y formatearla (€, %, decimales) — un informe con números en bruto no está acabado. Se usa DIVIDE en lugar de «/», y se ordenan las medidas en una tabla dedicada. Zineb formatea cada medida al crearla, sin excepción.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Tres medidas que se encajan
La base DAX de Zineb, de lo más simple a lo más compuesto:
Total Ventas = SUM(Ventas[Importe])
N.º Ventas = COUNTROWS(Ventas)
Ticket medio = DIVIDE([Total Ventas], [N.º Ventas])
Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París")
Cuota París = DIVIDE([Ventas París], [Total Ventas]) // formateada en %
Lectura: [Ticket medio] referencia [Total Ventas] y [N.º Ventas]: las medidas se construyen como ladrillos.
Lección: DIVIDE evita la división por cero; CALCULATE añade un filtro sin reescribir la fórmula.
Vocabulario de la sección
- DAX
- El lenguaje de las medidas y columnas calculadas: funciones tipo Excel, pero evaluadas en un contexto de modelo.
Ejemplo sencillo: Zineb escribe sus primeras medidas en DAX.
Lo que no es: una fórmula de Excel que solo mira celdas.
Reflejo: DAX = cálculos en contextos.
- SUM / AVERAGE / MIN / MAX
- Las agregaciones de base sobre una columna: SUM(Ventas[Importe]).
Ejemplo sencillo: Zineb calcula Total Ventas = SUM(Ventas[Importe]).
Lo que no es: una suma tecleada a mano en un visual.
Reflejo: una columna que agregar → SUM, AVERAGE, MIN, MAX.
- COUNTROWS vs COUNT
- COUNTROWS(Ventas) cuenta las filas de una tabla; COUNT cuenta los valores no vacíos de una columna.
Ejemplo sencillo: Zineb cuenta sus ventas con COUNTROWS(Ventas).
Lo que no es: una suma de importes, que no es un conteo.
Reflejo: contar acontecimientos → COUNTROWS(tabla).
- DIVIDE
- DIVIDE(numerador; denominador; [si_cero]): la división blindada, sin más error por cero.
Ejemplo sencillo: Zineb escribe Ticket medio = DIVIDE([Total Ventas], [N.º Ventas]).
Lo que no es: una división con «/» que puede devolver un error.
Reflejo: siempre DIVIDE en lugar de «/».
- CALCULATE
- LA función de DAX: evalúa una expresión en un contexto de filtro modificado.
Ejemplo sencillo: Zineb escribe Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París").
Lo que no es: una medida que suma todo sin filtrar.
Reflejo: «calcula esto, con este filtro».
En la práctica — En la práctica — Su base de medidas
- Cree las medidas de base: Total Ventas = SUM(Ventas[Importe]), N.º Ventas = COUNTROWS(Ventas), Ticket medio = DIVIDE([Total Ventas], [N.º Ventas]) — anote la reutilización de medidas dentro de una medida, como Zineb.
- Formatee cada medida (pestaña Herramientas de medida): € para los importes, separador de miles, 0 o 1 decimal.
- Primera CALCULATE: Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París") — colóquela en una tarjeta junto al Total Ventas.
- Una más: Cuota París = DIVIDE([Ventas París], [Total Ventas]) formateada en % — tres medidas que se encajan.
Guion paso a paso — escribir su base DAX como Zineb (8 min)
1) Nueva medida: Total Ventas = SUM(Ventas[Importe]). 2) Nueva medida: N.º Ventas = COUNTROWS(Ventas). 3) Ticket medio = DIVIDE([Total Ventas], [N.º Ventas]) — reutiliza medidas dentro de una medida. 4) Formatee cada medida (€, miles, decimales). 5) CALCULATE: Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París"), y luego Cuota París = DIVIDE([Ventas París], [Total Ventas]) en %. 6) Ordene todo en una tabla «_Medidas».
Si duda sobre una función DAX, la referencia dax.guide (SQLBI) documenta cada una con ejemplos.
Plantilla copiar-pegar — mi base de medidas
Total Ventas = SUM(Ventas[Importe])
N.º Ventas = COUNTROWS(Ventas)
Ticket medio = DIVIDE([Total Ventas], [N.º Ventas])
Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París")
Cuota París = DIVIDE([Ventas París], [Total Ventas]) // %
Reglas: DIVIDE (nunca «/»); formatear cada medida; tabla «_Medidas».
Cifra de negocio
Zineb escribe Total Ventas = SUM(Ventas[Importe]): la medida de base de todo su cuadro de mando.
Número de ventas
Zineb cuenta sus transacciones con N.º Ventas = COUNTROWS(Ventas), más fiable que un COUNT de columna.
Ticket medio
Ticket medio = DIVIDE([Total Ventas], [N.º Ventas]): una medida compuesta que se apoya en otras dos.
Las ventas de París
Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París"): las mismas ventas, pero filtradas a París.
✓ Buenas prácticas
- Construir las medidas como ladrillos (una medida referencia a otras).
- DIVIDE en lugar de «/» sistemáticamente.
- Formatear cada medida al crearla (€, %, decimales).
✗ Errores frecuentes
- Dividir con «/» (riesgo de error de división por cero).
- Dejar números en bruto sin formatear (informe sin acabar).
- Creer dominar CALCULATE de golpe (su profundidad está en el nivel 3).
Puntos clave
- Las medidas se construyen como ladrillos: una medida puede (debe) referenciar otras.
- DIVIDE sustituye a «/» sistemáticamente: la división por cero ya no existe.
- CALCULATE = «calcula esto, con este filtro»: la frase que repetirse.
- Formatee cada medida al crearla: un informe con números en bruto no está acabado.
Reto de 48 h — aplíquelo mañana
Componga la base de Zineb: escriba Total Ventas = SUM(Ventas[Importe]), N.º Ventas = COUNTROWS(Ventas) y Ticket medio = DIVIDE([Total Ventas], [N.º Ventas]), formatee cada medida, y luego añada Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París"). Ordene todo en una tabla «_Medidas».
- Escribo medidas DAX con SUM, AVERAGE y COUNTROWS.
- Uso DIVIDE en lugar de «/» y formateo cada medida.
- Escribo una CALCULATE simple que modifica el filtro.
Preguntas frecuentes
DAX se parece a las fórmulas de Excel: ¿es el mismo lenguaje?
La sintaxis se parece (SUM, AVERAGE, IF existen en ambos), pero la lógica difiere: Excel calcula celdas, DAX calcula en contextos (el visual, los filtros). Una misma medida da un resultado distinto según la ciudad de la barra o el mes de la columna. Sus conocimientos de Excel ayudan con la sintaxis; la lógica de contexto se aprende — es el salto del nivel 3.
¿Dónde aprender las funciones DAX más allá de esta guía?
La referencia oficial y gratuita es dax.guide (de SQLBI): documenta cada función con su sintaxis y ejemplos. Más allá, SQLBI (Marco Russo y Alberto Ferrari) es la referencia mundial del DAX, y Microsoft Learn ofrece itinerarios estructurados que preparan para la PL-300. Nuestra sección de recursos los cita.
¿Qué hace la función CALCULATE en DAX?