Aprende SQL · lección gratuita

Lección 13 · Funciones de agregación: COUNT, SUM, AVG, MIN, MAX

Resumen

Las funciones de agregación colapsan muchas filas en un solo valor resumen: cuentan, suman, promedian o buscan el extremo de una columna. Son la base de toda la analítica en SQL: ingresos totales, número de clientes, salario promedio, precio máximo. Cuando una consulta no tiene GROUP BY, una función de agregación reduce toda la tabla (tras el filtrado del WHERE) a una única fila.

Sintaxis / Conceptos

Una función de agregación recibe una expresión y devuelve un escalar. Sin GROUP BY, el SELECT solo puede contener agregados (no columnas "sueltas"), porque no habría un único valor que mostrar junto al resumen.

NULLs y agregados: todos los agregados salvo COUNT(*) ignoran NULLs. Esto importa con promedios: AVG(col) divide la suma entre la cantidad de valores no NULL, no entre el total de filas. En la semilla no hay NULLs, pero aparecerán al usar LEFT JOIN (Módulo 3).

Floats: revenue = cantidad precio_unitario (1 - descuento). Como descuento es REAL, el resultado es de punto flotante y puede arrastrar decimales largos. Envuelve siempre los totales con ROUND(expr, 2) para presentación y comparaciones estables.

SELECT COUNT(*) AS total, ROUND(AVG(salario),0) AS promedio, MAX(salario) AS maximo, MIN(salario) AS minimo FROM empleados

Ejemplos

-- Panorama global del negocio en una sola fila:
-- número de pedidos, clientes únicos, vendedores activos y canales distintos.
SELECT
  COUNT(*)                     AS total_pedidos,
  COUNT(DISTINCT cliente_id)   AS clientes_unicos,
  COUNT(DISTINCT empleado_id)  AS vendedores,
  COUNT(DISTINCT canal)        AS canales
FROM pedidos;

-- Revenue total de toda la empresa (suma de líneas), redondeado a 2 decimales.
SELECT ROUND(SUM(cantidad * precio_unitario * (1 - descuento)), 2) AS revenue_total
FROM detalle_pedidos;

-- Estadísticas salariales de la plantilla completa.
SELECT
  COUNT(*)               AS empleados,
  ROUND(AVG(salario), 2) AS salario_promedio,
  MIN(salario)           AS salario_minimo,
  MAX(salario)           AS salario_maximo,
  SUM(salario)           AS nomina_total
FROM empleados;

-- MIN/MAX también sirven con fechas (TEXT 'YYYY-MM-DD'): primer y último pedido.
SELECT MIN(fecha) AS primer_pedido, MAX(fecha) AS ultimo_pedido
FROM pedidos;
💡 COUNT(*) y COUNT(columna) NO son lo mismo: el primero cuenta filas, el segundo ignora NULLs. Y si quieres "cuántos valores diferentes hay", necesitas COUNT(DISTINCT columna) — un error clásico es escribir COUNT(canal) esperando 3 y obtener 40.

Cheatsheet

FunciónQué hace
COUNT(*)Cuenta todas las filas (incluye NULLs)
COUNT(col)Cuenta valores no NULL de col
COUNT(DISTINCT col)Cuenta valores distintos no NULL
SUM(expr)Suma valores (ignora NULLs)
AVG(expr)Promedio (ignora NULLs)
MIN(expr) / MAX(expr)Mínimo / máximo (números, texto, fechas)
ROUND(expr, n)Redondea a n decimales (clave con REALes)

---

← Conversión de tipos: CAST, COALESCE y NULLIFAgrupar datos: GROUP BY →

Ver todas las lecciones de Aprende SQL →