Funciones de agregación: COUNT, SUM, AVG

Lectura
25 min~8 min lectura

📊 Funciones de Agregación: COUNT, SUM y AVG

Bienvenido a esta lección fundamental sobre funciones de agregación en SQL. Estas funciones son herramientas esenciales que te permiten realizar cálculos sobre conjuntos de datos, obteniendo información resumida y estadísticas valiosas de tus tablas.

CONCEPTO CLAVE
Las funciones de agregación son funciones especiales que operan sobre múltiples filas y devuelven un único valor resumido. A diferencia de las funciones normales que procesan una fila a la vez, las agregaciones "recolectan" datos de muchas filas y los condensan en un resultado.

🎯 ¿Por qué son importantes las funciones de agregación?

Imagina que tienes una tabla con miles de registros de ventas. ¿Cómo responderías preguntas como:

  • ¿Cuántas ventas realizó mi empresa?
  • ¿Cuál es el ingreso total del mes?
  • ¿Cuál es el promedio de compra por cliente?

Sin funciones de agregación, tendrías que contar y calcular manualmente. ¡Sería un caos! Afortunadamente, SQL nos proporciona COUNT(), SUM() y AVG() para resolver estos problemas de manera elegante y eficiente.

📖 La Función COUNT()

La función COUNT() es probablemente la más utilizada de todas. Como su nombre indica, sirve para contar el número de filas que cumplen una condición específica.

📌 Sintaxis básica:
SELECT COUNT(columna) FROM tabla WHERE condición;

Ejemplo práctico con COUNT()

Consideremos nuestra tabla empleados:

id_empleadonombredepartamentosalario
1María GarcíaVentas2500
2Carlos LópezVentas2300
3Ana MartínezMarketing2200
4Pedro SánchezVentas2400
5Laura TorresRecursos Humanos2100
6Jorge RuizMarketing2300

Para contar cuántos empleados tenemos en total:

SELECT COUNT(*) FROM empleados;

Resultado: 6

Para contar cuántos empleados hay en el departamento de Ventas:

SELECT COUNT(*) FROM empleados WHERE departamento = 'Ventas';

Resultado: 3

💡 Tip importante: COUNT(*) cuenta TODAS las filas incluyendo las que contienen valores NULL. Si usas COUNT(nombre_columna), solo cuente las filas donde esa columna no sea NULL.

COUNT() con DISTINCT

¿Quieres saber cuántos departamentos diferentes existen? Utiliza DISTINCT junto con COUNT:

SELECT COUNT(DISTINCT departamento) FROM empleados;

Resultado: 3 (Ventas, Marketing, Recursos Humanos)

➕ La Función SUM()

La función SUM() calcula la suma total de los valores numéricos en una columna. Es perfecta para calcular totales de ventas, presupuestos, salarios, y cualquier otro valor acumulable.

📌 Sintaxis básica:
SELECT SUM(columna) FROM tabla WHERE condición;

Ejemplo práctico con SUM()

Para conocer el gasto total en nómina de nuestra empresa:

SELECT SUM(salario) FROM empleados;

Resultado: 13800 (suma de todos los salarios)

Para calcular el gasto en salarios solo del departamento de Marketing:

SELECT SUM(salario) FROM empleados WHERE departamento = 'Marketing';

Resultado: 4500 (2200 + 2300)

⚠️ Advertencia: SUM() solo funciona con columnas que contienen valores numéricos. Si intentas usar SUM() con texto o fechas, recibirás un error. Además, los valores NULL son ignorados en el cálculo, no se suman ni alteran el resultado.
Ver más: ¿Qué pasa con los valores NULL en SUM?

Cuando usas SUM(), los valores NULL son tratados como si no existieran. Por ejemplo:

-- Si tienes: 100, 200, NULL, 300
SELECT SUM(columna) FROM tabla;
-- Resultado: 600 (ignora el NULL)

Si necesitas tratar los NULL como cero, puedes usar COALESCE():

SELECT SUM(COALESCE(columna, 0)) FROM tabla;

📈 La Función AVG()

La función AVG() calcula el promedio aritmético de un conjunto de valores numéricos. Es extremadamente útil para análisis estadísticos y reportes de negocio.

📌 Sintaxis básica:
SELECT AVG(columna) FROM tabla WHERE condición;

Ejemplo práctico con AVG()

Para conocer el salario promedio de todos los empleados:

SELECT AVG(salario) FROM empleados;

Resultado: 2300 (13800 / 6)

Para calcular el salario promedio por departamento:

SELECT AVG(salario) FROM empleados WHERE departamento = 'Ventas';

Resultado: 2400 (promedio de 2500, 2300 y 2400)

💡 Tip práctico: El resultado de AVG() puede tener muchos decimales. Para redondearlo, usa la función ROUND():
SELECT ROUND(AVG(salario), 2) FROM empleados;

🔧 Combinando Funciones de Agregación

Una de las grandes ventajas de SQL es que puedes usar múltiples funciones de agregación en una sola consulta. Esto te permite obtener un resumen completo de tus datos.

SELECT 
    COUNT(*) AS total_empleados,
    COUNT(DISTINCT departamento) AS num_departamentos,
    SUM(salario) AS gasto_total_nomina,
    AVG(salario) AS salario_promedio
FROM empleados;

Resultado:

total_empleadosnum_departamentosgasto_total_nominasalario_promedio
63138002300
"Las funciones de agregación son los ojos estadísticos de SQL. Sin ellas, analizar datos sería como intentar leer un libro contando cada letra individualmente."

📋 Usando GROUP BY con Funciones de Agregación

Aquí es donde las cosas se ponen realmente interesantes. El cláusula GROUP BY te permite segmentar tus datos en grupos y aplicar funciones de agregación a cada grupo.

CONCEPTO CLAVE
GROUP BY divide tus datos en grupos lógicos basados en una o más columnas. Luego, las funciones de agregación se aplican a cada grupo por separado, dándote un resultado por cada grupo único.

Ejemplo con GROUP BY

Para obtener estadísticas de cada departamento:

SELECT 
    departamento,
    COUNT(*) AS num_empleados,
    SUM(salario) AS total_salarios,
    AVG(salario) AS salario_promedio
FROM empleados
GROUP BY departamento;

Resultado:

departamentonum_empleadostotal_salariossalario_promedio
Marketing245002250
Recursos Humanos121002100
Ventas372002400
  1. SELECT departamento: Especifica la columna por la que queremos agrupar.
  2. COUNT(*), SUM(salario), AVG(salario): Las funciones de agregación que calculan estadísticas para cada grupo.
  3. GROUP BY departamento: Le dice a SQL que cree un grupo por cada departamento único.
⚠️ Regla importante: Cuando usas GROUP BY, toda columna en el SELECT que NO sea una función de agregación DEBE aparecer en el GROUP BY. Si intentas seleccionar una columna sin agregación que no esté en GROUP BY, recibirás un error o resultados inesperados según el sistema de base de datos.

🎯 Filtrando Grupos con HAVING

Ya conoces WHERE para filtrar filas individuales. Pero ¿cómo filtras grupos completos? Con HAVING.

Supongamos que solo queremos ver los departamentos con más de 2 empleados:

SELECT 
    departamento,
    COUNT(*) AS num_empleados,
    AVG(salario) AS salario_promedio
FROM empleados
GROUP BY departamento
HAVING COUNT(*) > 1;

Resultado:

departamentonum_empleadossalario_promedio
Marketing22250
Ventas32400
💡 WHERE vs HAVING: WHERE filtra filas ANTES de agrupar, mientras que HAVING filtra grupos DESPUÉS de agrupar. Es una distinción crucial que dominarás con la práctica.
Ver más: Ejemplo completo con WHERE y HAVING
SELECT 
    departamento,
    COUNT(*) AS num_empleados,
    AVG(salario) AS salario_promedio
FROM empleados
WHERE salario > 2000          -- Filtra filas individuales primero
GROUP BY departamento
HAVING AVG(salario) > 2200;  -- Filtra grupos después

-- Primero: Selecciona empleados con salario > 2000
-- Segundo: Agrupa por departamento
-- Tercero: Calcula estadísticas por grupo
-- Cuarto: Muestra solo grupos con promedio > 2200

📚 Ejemplos de la Vida Real

Escenario 1: Reporte de Ventas

SELECT 
    categoria_producto,
    COUNT(*) AS total_productos_vendidos,
    SUM(cantidad) AS unidades_totales,
    SUM(cantidad * precio_unitario) AS ingreso_total,
    AVG(precio_unitario) AS precio_promedio
FROM ventas
WHERE fecha_venta BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY categoria_producto
ORDER BY ingreso_total DESC;

Escenario 2: Análisis de Clientes

SELECT 
    tipo_cliente,
    COUNT(DISTINCT id_cliente) AS clientes_unicos,
    SUM(total_compra) AS volumen_compras,
    AVG(total_compra) AS ticket_promedio
FROM ordenes
GROUP BY tipo_cliente
HAVING COUNT(*) >= 10;

🧠 Quiz de Refuerzo

🧠 Quiz

¿Cuál de las siguientes afirmaciones sobre la función COUNT() es CORRECTA?

  • A) COUNT() solo puede usarse con columnas numéricas
  • B) COUNT(*) cuenta todas las filas, incluyendo las que tienen valores NULL
  • C) COUNT() devuelve el promedio de los valores
  • D) COUNT() requiere obligatoriamente el uso de GROUP BY
✅ Respuesta correcta: B) COUNT(*) cuenta todas las filas, incluyendo las que tienen valores NULL. COUNT(*) es específicamente diseñada para contar filas completas. Para contar valores no nulos de una columna específica, usarías COUNT(nombre_columna).
🧠 Quiz

¿Qué función usarías para obtener el ingreso total de todas las ventas?

  • A) COUNT()
  • B) AVG()
  • C) SUM()
  • D) MAX()
✅ Respuesta correcta: C) SUM(). SUM() es la función diseñada para sumar valores numéricos, perfecta para calcular totales como ingresos, presupuestos o cualquier valor acumulable.
🧠 Quiz

¿Cuál es la diferencia principal entre WHERE y HAVING?

  • A) No hay diferencia, son sinónimos
  • B) WHERE filtra antes de agrupar, HAVING filtra después de agrupar
  • C) WHERE solo funciona con texto, HAVING solo con números
  • D) HAVING es más rápido que WHERE
✅ Respuesta correcta: B) WHERE filtra filas ANTES de que se realice la agregación, mientras que HAVING filtra los grupos resultantes DESPUÉS de la agregación. Esta distinción es fundamental para escribir consultas precisas.

📝 Resumen de la Lección

📌 Puntos clave para recordar:
  • COUNT(): Cuenta filas o valores no nulos. Usa COUNT(*) para contar todas las filas.
  • SUM(): Suma valores numéricos. Ignora valores NULL automáticamente.
  • AVG(): Calcula el promedio aritmético. Ignora valores NULL en el cálculo.
  • GROUP BY: Agrupa datos para aplicar agregaciones por categoría.
  • HAVING: Filtra grupos después de la agregación (WHERE filtra antes).
  • DISTINCT: Se puede combinar con COUNT para contar valores únicos.
"Dominar las funciones de agregación es como aprender a leer las estadísticas de un negocio. Una vez que las entiendas, podrás transformar datos crudos en información valiosa para la toma de decisiones."

🚀 Próximos Pasos

En la próxima lección, exploraremos funciones de agregación adicionales como MIN(), MAX(), y aprenderemos sobre subconsultas para realizar análisis más sofisticados. ¡Sigue practicando con consultas reales para consolidar estos conocimientos!

💡 Consejo final: La mejor manera de aprender SQL es practicando. Crea tus propias tablas de prueba, inserta datos variados (incluyendo valores NULL), y experimenta combinando las diferentes funciones que has aprendido hoy. La repetición es la madre del aprendizaje.