📊 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.
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.
SELECT COUNT(columna) FROM tabla WHERE condición;
Ejemplo práctico con COUNT()
Consideremos nuestra tabla empleados:
| id_empleado | nombre | departamento | salario |
|---|---|---|---|
| 1 | María García | Ventas | 2500 |
| 2 | Carlos López | Ventas | 2300 |
| 3 | Ana Martínez | Marketing | 2200 |
| 4 | Pedro Sánchez | Ventas | 2400 |
| 5 | Laura Torres | Recursos Humanos | 2100 |
| 6 | Jorge Ruiz | Marketing | 2300 |
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
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.
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)
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.
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)
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_empleados | num_departamentos | gasto_total_nomina | salario_promedio |
|---|---|---|---|
| 6 | 3 | 13800 | 2300 |
"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.
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:
| departamento | num_empleados | total_salarios | salario_promedio |
|---|---|---|---|
| Marketing | 2 | 4500 | 2250 |
| Recursos Humanos | 1 | 2100 | 2100 |
| Ventas | 3 | 7200 | 2400 |
- SELECT departamento: Especifica la columna por la que queremos agrupar.
- COUNT(*), SUM(salario), AVG(salario): Las funciones de agregación que calculan estadísticas para cada grupo.
- GROUP BY departamento: Le dice a SQL que cree un grupo por cada departamento único.
🎯 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:
| departamento | num_empleados | salario_promedio |
|---|---|---|
| Marketing | 2 | 2250 |
| Ventas | 3 | 2400 |
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
¿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
¿Qué función usarías para obtener el ingreso total de todas las ventas?
- A) COUNT()
- B) AVG()
- C) SUM()
- D) MAX()
¿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
📝 Resumen de la Lección
- 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!