Funciones de agregación
Las funciones de agregación resumen muchas filas en un solo valor: cuántos clientes hay, cuál es el saldo total, el score promedio. Son las herramientas que convierten datos crudos en información útil para decisiones de negocio.
Concepto teórico
Las 5 funciones esenciales
| Función | Qué hace | Ignora NULL? | Ejemplo |
|---|---|---|---|
COUNT(*) |
Cuenta TODAS las filas | No (cuenta todo) | COUNT(*) → 5 |
COUNT(col) |
Cuenta filas donde col NO es NULL | Sí | COUNT(email) → 3 |
SUM(col) |
Suma valores | Sí | SUM(saldo) → 1477000 |
AVG(col) |
Promedio | Sí | AVG(score) → 689 |
MIN(col) |
Valor mínimo | Sí | MIN(score) → 590 |
MAX(col) |
Valor máximo | Sí | MAX(saldo) → 890000 |
COUNT(*) cuenta TODAS las filas sin importar nada. COUNT(email) cuenta solo
las filas donde email NO es NULL. Si tenés 5 clientes y 2 no tienen email: COUNT(*) = 5,
COUNT(email) = 3.
AVG() ignora los NULLs, no los trata como 0.
Esto es importante: si tenés saldos [100, NULL, 200], AVG(saldo) = 150 (promedia solo los 2 valores
existentes), NO 100 (promedio con 0 incluido). Esto puede distorsionar resultados si hay muchos NULLs.COUNT(DISTINCT col)
Combina conteo con deduplicación: cuenta cuántos valores ÚNICOS hay en una columna.
SELECT COUNT(*) AS total_registros,
COUNT(DISTINCT cliente) AS clientes_unicos,
COUNT(DISTINCT ciudad) AS ciudades
FROM transacciones;
Combinar agregaciones con WHERE
WHERE filtra ANTES de agregar. Esto te permite calcular estadísticas sobre un subconjunto:
-- Promedio de score SOLO de clientes activos SELECT AVG(score) AS avg_score_activos FROM clientes WHERE activo = 1;
ROUND con agregaciones
ROUND(valor, decimales) redondea. Se usa constantemente con AVG y cálculos de porcentaje:
SELECT ROUND(AVG(score), 0) AS score_promedio,
ROUND(AVG(saldo), 2) AS saldo_promedio,
ROUND(SUM(saldo) * 100.0 / 1000000, 1) AS pct_del_millon
FROM clientes;
COUNT(*) = len(df),
SUM(col) = df["col"].sum(), AVG(col) = df["col"].mean(),
COUNT(DISTINCT col) = df["col"].nunique(). Las mismas operaciones, distinto lenguaje.
Ejemplos explicados paso a paso
Ejemplo 1: Las 5 funciones en acción
Hacé clic en ▶ Ejecutar
Ejemplo 2: COUNT(*) vs COUNT(col) — la diferencia clave
Hacé clic en ▶ Ejecutar
Ejemplo 3: Agregaciones con WHERE
Hacé clic en ▶ Ejecutar
Ejemplo 4: Dashboard de métricas en una consulta
Hacé clic en ▶ Ejecutar
Ejemplo 5: Estadísticas de transacciones
Hacé clic en ▶ Ejecutar
Referencia rápida
| Función | Descripción | NULLs | Equivalente pandas |
|---|---|---|---|
COUNT(*) |
Total de filas | Cuenta todo | len(df) |
COUNT(col) |
Filas no-NULL | Ignora | df["col"].count() |
COUNT(DISTINCT col) |
Valores únicos | Ignora | df["col"].nunique() |
SUM(col) |
Suma | Ignora | df["col"].sum() |
AVG(col) |
Promedio | Ignora | df["col"].mean() |
MIN(col) |
Mínimo | Ignora | df["col"].min() |
MAX(col) |
Máximo | Ignora | df["col"].max() |
Ejercicios
Ejercicio 1: COUNT(*)
Contá el total de productos. Debe incluir 5.
Hacé clic en ▶ Ejecutar
Ejercicio 2: SUM
Calculá el saldo total de todos los clientes. Debe incluir 1477000.
Hacé clic en ▶ Ejecutar
Ejercicio 3: AVG con ROUND
Calculá el score promedio redondeado a entero. Debe incluir 689.
Hacé clic en ▶ Ejecutar
Ejercicio 4: MIN y MAX
Encontrá el score mínimo y máximo, y la diferencia (rango). Debe incluir 220.
Hacé clic en ▶ Ejecutar
Ejercicio 5: COUNT(*) vs COUNT(col)
Mostrá COUNT(*) y COUNT(email) para ver la diferencia. Debe incluir 3 (los que tienen email).
Hacé clic en ▶ Ejecutar
Ejercicio 6: Agregación con WHERE
Calculá saldo promedio de clientes activos de Buenos Aires. Debe incluir 416667.
Hacé clic en ▶ Ejecutar
Ejercicio 7: COUNT(DISTINCT)
De una tabla de transacciones, contá transacciones totales, clientes únicos y tipos únicos. Debe incluir
3 (clientes).
Hacé clic en ▶ Ejecutar
Ejercicio 8: Porcentaje del total
Calculá qué porcentaje del saldo total representa Buenos Aires. Debe incluir un porcentaje (redondeado).
Hacé clic en ▶ Ejecutar
Ejercicio 9: Múltiples métricas con SUM+CASE
En una sola consulta: total de ventas, cantidad de compras, cantidad de ventas, monto promedio por tipo
usando SUM+CASE. Debe incluir compra.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Reporte ejecutivo completo
Generá un "dashboard" en una sola fila: total clientes, activos, inactivos, % activos, saldo total, promedio,
máximo, ciudades únicas, y cantidad de premium (score>=700). Debe incluir total.
Hacé clic en ▶ Ejecutar
Resumen y conexión
COUNT(*)cuenta todas las filas.COUNT(col)cuenta solo las no-NULL.SUM, AVG, MIN, MAXignoran NULLs automáticamente.COUNT(DISTINCT col)cuenta valores únicos.ROUND(valor, n)redondea a n decimales.- WHERE filtra ANTES de la agregación.
SUM(CASE WHEN ... THEN 1 ELSE 0 END)permite contar condicionalmente.
En la siguiente lección (06 · GROUP BY y HAVING) vas a aprender a agrupar datos: estadísticas
POR CIUDAD, POR TIPO, POR CATEGORÍA — el equivalente de df.groupby() en pandas.