Lección 17 de 36DAX Esencial

Medidas básicas: SUM, AVERAGE, COUNT

Las funciones de agregación fundamentales.

20 minutos

En esta lección dominarás las funciones de agregación que usarás en el 90% de tus dashboards. Aunque parecen simples, saber cuándo y cómo usarlas correctamente es lo que separa a un principiante de un profesional.

El escenario: Datos de ventas

Para todos los ejemplos usaremos una tabla de ventas típica:

Fecha Producto Categoría Cantidad Precio Unitario Monto Vendedor Cliente
2024-01-15 Laptop Pro Electrónicos 2 1,200 2,400 Ana García Empresa ABC
2024-01-15 Mouse Inalámbrico Accesorios 5 35 175 Ana García Empresa ABC
2024-01-16 Laptop Pro Electrónicos 1 1,200 1,200 Carlos López Tech Solutions
2024-01-16 Teclado Mecánico Accesorios 3 85 255 Carlos López Startup XYZ
2024-01-17 Monitor 27" Electrónicos 2 450 900 Ana García Empresa ABC

SUM: La función más usada

SUM suma todos los valores de una columna, respetando el contexto de filtro.

Sintaxis

SUM(Tabla[Columna])

Ejemplos prácticos

// Total de ventas en dinero
Total Ventas = SUM(Ventas[Monto])

// Total de unidades vendidas
Total Unidades = SUM(Ventas[Cantidad])

// Total de descuentos aplicados
Total Descuentos = SUM(Ventas[Descuento])

Cómo se comporta con filtros

Imagina que tienes la medida Total Ventas = SUM(Ventas[Monto]):

Contexto Resultado
Sin filtros $4,930 (suma de toda la tabla)
Filtro: Categoría = "Electrónicos" $4,500
Filtro: Vendedor = "Ana García" $3,475
Filtro: Fecha = "2024-01-16" $1,455

La medida automáticamente responde a cualquier filtro. No necesitas escribir código adicional.

Variante: SUMX (iterador)

Cuando necesitas sumar una expresión calculada fila por fila:

// Calcular el monto con descuento para cada fila y luego sumar
Total con Descuento =
SUMX(
    Ventas,
    Ventas[Monto] * (1 - Ventas[PorcentajeDescuento])
)

SUMX itera sobre cada fila de la tabla, calcula la expresión, y luego suma todos los resultados.

AVERAGE: Promedios inteligentes

AVERAGE calcula el promedio aritmético de una columna.

Sintaxis

AVERAGE(Tabla[Columna])

Ejemplos prácticos

// Ticket promedio (monto promedio por transacción)
Ticket Promedio = AVERAGE(Ventas[Monto])

// Precio promedio de productos vendidos
Precio Promedio = AVERAGE(Ventas[Precio Unitario])

// Cantidad promedio por pedido
Cantidad Promedio = AVERAGE(Ventas[Cantidad])

Diferencia entre AVERAGE y AVERAGEX

// AVERAGE: promedio simple de una columna
Ticket Promedio = AVERAGE(Ventas[Monto])

// AVERAGEX: promedio de una expresión calculada
Margen Promedio % =
AVERAGEX(
    Ventas,
    DIVIDE(Ventas[Monto] - Ventas[Costo], Ventas[Monto], 0)
)

Variantes de AVERAGE

Función Descripción
AVERAGE Promedio de columna numérica
AVERAGEA Incluye texto (cuenta como 0) y booleanos
AVERAGEX Promedio de una expresión por fila

Caso real: Métricas de ticket

// Suite completa de métricas de ticket
Ticket Promedio = AVERAGE(Ventas[Monto])

Ticket Mediano = MEDIAN(Ventas[Monto])

Ticket Máximo = MAX(Ventas[Monto])

Ticket Mínimo = MIN(Ventas[Monto])

Tip: El ticket promedio puede ser engañoso con outliers. Considera también mostrar la mediana para una visión más realista.

COUNT: Contando registros

Las funciones de conteo son fundamentales para entender el volumen de tu negocio.

Familia de funciones COUNT

Función Qué cuenta Incluye blancos
COUNT Valores numéricos No
COUNTA Cualquier valor no vacío No
COUNTBLANK Celdas vacías Sí (solo blancos)
COUNTROWS Filas de una tabla N/A
DISTINCTCOUNT Valores únicos No

COUNT vs COUNTA

// COUNT: solo cuenta números
// Si hay textos o blancos, no los cuenta
Conteo Numérico = COUNT(Ventas[Monto])

// COUNTA: cuenta cualquier valor no vacío
// Incluye textos, números, fechas
Conteo Total = COUNTA(Ventas[Producto])

COUNTROWS: La más usada para contar transacciones

// Número de transacciones/filas
Total Transacciones = COUNTROWS(Ventas)

// Equivalente menos elegante
Total Transacciones = COUNTA(Ventas[Monto])

Recomendación: Usa COUNTROWS para contar transacciones. Es más claro y eficiente.

Ejemplos prácticos de conteo

// Número de ventas realizadas
Total Ventas Realizadas = COUNTROWS(Ventas)

// Número de productos diferentes vendidos
Productos Vendidos = DISTINCTCOUNT(Ventas[Producto])

// Número de clientes únicos
Clientes Activos = DISTINCTCOUNT(Ventas[Cliente])

// Número de vendedores con ventas
Vendedores Activos = DISTINCTCOUNT(Ventas[Vendedor])

// Días con ventas
Días con Actividad = DISTINCTCOUNT(Ventas[Fecha])

DISTINCTCOUNT: Contando valores únicos

Esta función es esencial para KPIs de negocio reales.

Sintaxis

DISTINCTCOUNT(Tabla[Columna])

Por qué es importante

Imagina una tabla con 10,000 transacciones:

  • COUNTROWS(Ventas) = 10,000 transacciones
  • DISTINCTCOUNT(Ventas[Cliente]) = 850 clientes únicos
  • DISTINCTCOUNT(Ventas[Producto]) = 120 productos diferentes

Métricas de negocio con DISTINCTCOUNT

// Clientes únicos que compraron
Clientes = DISTINCTCOUNT(Ventas[ClienteID])

// Productos diferentes vendidos
SKUs Vendidos = DISTINCTCOUNT(Ventas[ProductoID])

// Ciudades donde vendimos
Ciudades Alcanzadas = DISTINCTCOUNT(Ventas[Ciudad])

// Meses con ventas
Meses Activos = DISTINCTCOUNT(Ventas[Mes])

Combinando con otras medidas

// Ventas promedio por cliente
Venta Promedio por Cliente =
DIVIDE(
    SUM(Ventas[Monto]),
    DISTINCTCOUNT(Ventas[ClienteID]),
    0
)

// Transacciones promedio por cliente
Frecuencia de Compra =
DIVIDE(
    COUNTROWS(Ventas),
    DISTINCTCOUNT(Ventas[ClienteID]),
    0
)

// Productos promedio por transacción
Productos por Ticket =
DIVIDE(
    COUNTROWS(Ventas),
    DISTINCTCOUNT(Ventas[TransaccionID]),
    0
)

MIN y MAX: Rangos y extremos

Estas funciones encuentran los valores mínimos y máximos.

Sintaxis

MIN(Tabla[Columna])
MAX(Tabla[Columna])

Usos comunes

// Rango de fechas
Primera Venta = MIN(Ventas[Fecha])
Última Venta = MAX(Ventas[Fecha])

// Rangos de montos
Venta Mínima = MIN(Ventas[Monto])
Venta Máxima = MAX(Ventas[Monto])

// Rango de precios
Precio Más Bajo = MIN(Ventas[Precio Unitario])
Precio Más Alto = MAX(Ventas[Precio Unitario])

Usos creativos

// Días desde la última venta
Días desde Última Venta =
DATEDIFF(
    MAX(Ventas[Fecha]),
    TODAY(),
    DAY
)

// Rango de fechas como texto
Período de Datos =
"Del " & FORMAT(MIN(Ventas[Fecha]), "DD/MM/YYYY") &
" al " & FORMAT(MAX(Ventas[Fecha]), "DD/MM/YYYY")

MINX y MAXX (iteradores)

// El cliente con el monto más alto en una sola compra
Compra Individual Más Alta =
MAXX(
    Ventas,
    Ventas[Monto]
)

// El margen porcentual más bajo
Peor Margen =
MINX(
    Ventas,
    DIVIDE(Ventas[Monto] - Ventas[Costo], Ventas[Monto], 0)
)

Creando un dashboard de métricas básicas

Vamos a construir un conjunto completo de medidas para un dashboard de ventas:

Paso 1: Métricas de volumen

// Medidas de volumen
Total Ventas = SUM(Ventas[Monto])

Total Unidades = SUM(Ventas[Cantidad])

Total Transacciones = COUNTROWS(Ventas)

Paso 2: Métricas de promedio

// Medidas de promedio
Ticket Promedio =
DIVIDE(
    SUM(Ventas[Monto]),
    COUNTROWS(Ventas),
    0
)

Unidades por Transacción =
DIVIDE(
    SUM(Ventas[Cantidad]),
    COUNTROWS(Ventas),
    0
)

Precio Promedio = AVERAGE(Ventas[Precio Unitario])

Paso 3: Métricas de clientes

// Medidas de clientes
Total Clientes = DISTINCTCOUNT(Ventas[ClienteID])

Venta por Cliente =
DIVIDE(
    SUM(Ventas[Monto]),
    DISTINCTCOUNT(Ventas[ClienteID]),
    0
)

Frecuencia de Compra =
DIVIDE(
    COUNTROWS(Ventas),
    DISTINCTCOUNT(Ventas[ClienteID]),
    0
)

Paso 4: Métricas de productos

// Medidas de productos
Productos Vendidos = DISTINCTCOUNT(Ventas[ProductoID])

Venta por SKU =
DIVIDE(
    SUM(Ventas[Monto]),
    DISTINCTCOUNT(Ventas[ProductoID]),
    0
)

Paso 5: Métricas de rango

// Medidas de rango
Primera Venta = MIN(Ventas[Fecha])

Última Venta = MAX(Ventas[Fecha])

Venta Máxima = MAX(Ventas[Monto])

Venta Mínima = MIN(Ventas[Monto])

Formateando tus medidas

El formato correcto hace que tus dashboards sean profesionales.

Cómo formatear en Power BI

  1. Selecciona la medida en el panel de campos
  2. Ve a Herramientas de medida en la cinta
  3. Configura:
    • Formato: Moneda, Porcentaje, Número, etc.
    • Decimales: 0-2 según la precisión necesaria
    • Símbolo: $, %, etc.

Recomendaciones de formato

Tipo de medida Formato Decimales Ejemplo
Montos Moneda 0-2 $1,234,567
Cantidades Número entero 0 1,234
Promedios de dinero Moneda 2 $45.67
Conteos Número entero 0 850
Porcentajes Porcentaje 1-2 23.5%
Fechas Fecha corta N/A 15/01/2024

Formateo con DAX (alternativa)

// Forzar formato en la propia medida
Total Ventas Formateado =
FORMAT(SUM(Ventas[Monto]), "$#,##0")

// Porcentaje formateado
Margen % =
FORMAT(
    DIVIDE(SUM(Ventas[Margen]), SUM(Ventas[Monto]), 0),
    "0.0%"
)

Nota: Es mejor formatear desde las propiedades de la medida que con FORMAT(), ya que FORMAT() convierte el resultado a texto y puede causar problemas en visualizaciones.

Errores comunes y soluciones

Error 1: Confundir COUNT con COUNTROWS

// Problema: COUNT de una columna con blancos
Total = COUNT(Ventas[Descuento])  // Puede dar menos que las filas reales

// Solución: Usar COUNTROWS para contar filas
Total Filas = COUNTROWS(Ventas)

Error 2: División sin protección

// Problema: Error cuando el denominador es 0
Ticket Promedio = SUM(Ventas[Monto]) / COUNTROWS(Ventas)

// Solución: Usar DIVIDE
Ticket Promedio =
DIVIDE(
    SUM(Ventas[Monto]),
    COUNTROWS(Ventas),
    0  // Valor cuando hay división por cero
)

Error 3: No aprovechar el contexto

// Innecesario: filtrar manualmente
Ventas Mexico =
CALCULATE(
    SUM(Ventas[Monto]),
    Ventas[País] = "México"
)

// Mejor: crear una medida simple y filtrar en el visual
Total Ventas = SUM(Ventas[Monto])
// Luego filtrar por País = "México" en el slicer

Solo usa CALCULATE cuando necesites un filtro que NO viene del contexto del visual.

Error 4: Medidas sin sentido de negocio

// Sin contexto: ¿qué significa este número?
Número = COUNT(Ventas[ProductoID])

// Con contexto: nombre descriptivo
Líneas de Producto Vendidas = COUNT(Ventas[ProductoID])

Organizando tus medidas

Crear carpetas de medidas

En Power BI Desktop:

  1. Selecciona una medida
  2. En Propiedades, encuentra Carpeta de presentación
  3. Escribe el nombre de la carpeta (ej: "Métricas de Ventas")

Estructura recomendada

📁 _Navegación
   - Título Dashboard
   - Fecha de Actualización

📁 Métricas de Volumen
   - Total Ventas
   - Total Unidades
   - Total Transacciones

📁 Métricas de Promedio
   - Ticket Promedio
   - Precio Promedio
   - Unidades por Transacción

📁 Métricas de Clientes
   - Total Clientes
   - Venta por Cliente
   - Frecuencia de Compra

📁 Métricas de Tiempo
   - Primera Venta
   - Última Venta
   - Días de Operación

Tip: Usa el prefijo _ para que las carpetas de utilidad aparezcan primero alfabéticamente.

Práctica: Crea estas medidas

Usando la tabla de ventas del inicio, crea las siguientes medidas:

  1. Total de ingresos (suma de Monto)
  2. Número de transacciones (conteo de filas)
  3. Ticket promedio (ingresos / transacciones)
  4. Clientes únicos (conteo distinto de Cliente)
  5. Productos únicos vendidos (conteo distinto de Producto)
  6. Ingreso por cliente (ingresos / clientes únicos)
  7. Primera y última fecha de venta (mín y máx de Fecha)

Puntos clave de esta lección

  • SUM suma valores; úsala para totales de dinero, cantidades, etc.
  • AVERAGE calcula promedios; ideal para tickets y precios promedio
  • COUNTROWS cuenta filas; mejor que COUNT para transacciones
  • DISTINCTCOUNT cuenta valores únicos; esencial para clientes, productos, etc.
  • MIN/MAX encuentran extremos; útiles para rangos y fechas
  • Siempre usa DIVIDE() para divisiones seguras
  • Formatea tus medidas para profesionalismo
  • Organiza medidas en carpetas para mantener orden

Próxima lección

En la siguiente lección aprenderás la función más poderosa de DAX: CALCULATE. Descubrirás cómo modificar el contexto de filtro para crear métricas comparativas y análisis avanzados.


Quiz de comprensión

  1. ¿Cuál es la diferencia entre COUNT y COUNTROWS?

  2. ¿Por qué usarías DISTINCTCOUNT en lugar de COUNTROWS?

  3. Escribe una medida DAX para calcular el ticket promedio (monto total / número de transacciones).

  4. ¿Qué función usarías para encontrar la fecha de la primera venta?

  5. ¿Por qué es importante usar DIVIDE en lugar del operador /?

  6. Tienes una tabla de ventas con 10,000 filas y 500 clientes únicos. ¿Qué devolverían COUNTROWS(Ventas) y DISTINCTCOUNT(Ventas[ClienteID])?

Completaste esta leccion?

Marca esta leccion como completada. Tu progreso se guardara en tu navegador.