2.4 · Introducción a DAX: SUM, AVERAGE, COUNT

Nivel 2 · Modelo y DAX

2.4Introducción a DAX: SUM, AVERAGE, COUNT

Objetivo: Escribir una base de medidas limpias, formateadas y reutilizables — y domesticar CALCULATE en un caso simple.
Tiempo estimado: 20 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

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.

Error frecuente de interpretación: «DAX es exactamente Excel: divido con «/», dejo los números en bruto y CALCULATE se aprende en dos minutos». No, triple error. La sintaxis se parece a Excel, pero la lógica difiere: DAX calcula en contextos (el visual, los filtros), no en celdas. Se divide con DIVIDE para evitar la división por cero. Y se formatea cada medida al crearla — unos números en bruto hacen un informe sin acabar. CALCULATE, por su parte, se domina en el nivel 3.
El DAX de base Ladrillos que se encajan: agregaciones, DIVIDE y luego CALCULATE. AgregacionesSUM, AVERAGE, COUNTROWS, MIN, MAX+DIVIDEDivisión blindada (nada de /0)+CALCULATE«Calcula esto, con este filtro» Formatear cada medida al crearla (€, %, decimales).
Ladrillos que se encajan: agregaciones, DIVIDE y luego CALCULATE.
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Zineb, controladora de gestión en Argel, escribe sus primeras medidas DAX: las agregaciones de base SUM, AVERAGE, COUNTROWS, MIN, MAX sobre columnas — y DIVIDE para la división blindada, nunca más un error de división por cero. 2) Compone una base de ladrillos: Total Ventas = SUM(Ventas[Importe]), N.º Ventas = COUNTROWS(Ventas), Ticket medio = DIVIDE([Total Ventas], [N.º Ventas]) — una medida referencia a otra. 3) Domestica CALCULATE — «las ventas, pero para París»: Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París") — y retiene las buenas costumbres: nombrar con claridad y formatear cada medida. Lección: construir como ladrillos, DIVIDE sistemáticamente, formatear al crear.

🔎 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

  1. 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.
  2. Formatee cada medida (pestaña Herramientas de medida): € para los importes, separador de miles, 0 o 1 decimal.
  3. Primera CALCULATE: Ventas París = CALCULATE([Total Ventas], Ventas[Ciudad] = "París") — colóquela en una tarjeta junto al Total Ventas.
  4. Una más: Cuota París = DIVIDE([Ventas París], [Total Ventas]) formateada en % — tres medidas que se encajan.
Una base de medidas limpias, formateadas, reutilizables — y CALCULATE domesticada en un caso simple.

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».

Lista de salida de la sección
  • 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.
Autoevaluación 1-5: ¿construyo medidas como ladrillos sin dudar?Autoevaluación 1-5: ¿he escrito y formateado una base de medidas reutilizables?

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.

Comprueba tu comprensión

¿Qué hace la función CALCULATE en DAX?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 2Preguntas inéditas y más difíciles para validar tus conocimientos