Medidas básicas: SUM, AVERAGE, COUNT
Las funciones de agregación fundamentales.
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 transaccionesDISTINCTCOUNT(Ventas[Cliente])= 850 clientes únicosDISTINCTCOUNT(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
- Selecciona la medida en el panel de campos
- Ve a Herramientas de medida en la cinta
- 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:
- Selecciona una medida
- En Propiedades, encuentra Carpeta de presentación
- 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:
- Total de ingresos (suma de Monto)
- Número de transacciones (conteo de filas)
- Ticket promedio (ingresos / transacciones)
- Clientes únicos (conteo distinto de Cliente)
- Productos únicos vendidos (conteo distinto de Producto)
- Ingreso por cliente (ingresos / clientes únicos)
- 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
¿Cuál es la diferencia entre
COUNTyCOUNTROWS?¿Por qué usarías
DISTINCTCOUNTen lugar deCOUNTROWS?Escribe una medida DAX para calcular el ticket promedio (monto total / número de transacciones).
¿Qué función usarías para encontrar la fecha de la primera venta?
¿Por qué es importante usar
DIVIDEen lugar del operador/?Tienes una tabla de ventas con 10,000 filas y 500 clientes únicos. ¿Qué devolverían
COUNTROWS(Ventas)yDISTINCTCOUNT(Ventas[ClienteID])?
Completaste esta leccion?
Marca esta leccion como completada. Tu progreso se guardara en tu navegador.