SQL y Bases de DatosConsultas AvanzadasLección 7 de 20
GROUP BY y Funciones Agregadas
Las funciones agregadas calculan un valor a partir de múltiples filas: COUNT cuenta registros, SUM suma valores, AVG calcula promedios, MIN y MAX encuentran extremos. GROUP BY agrupa filas para aplicar estas funciones por categoría. HAVING filtra grupos (como WHERE pero para grupos).
-- COUNT: contar filas
SELECT COUNT(*) AS total_usuarios FROM users;
SELECT COUNT(telefono) AS con_telefono FROM users; -- ignora NULL
SELECT COUNT(DISTINCT pais) AS paises FROM users;
-- SUM, AVG, MIN, MAX
SELECT
SUM(total) AS ingresos_totales,
AVG(total) AS ticket_promedio,
MIN(total) AS pedido_minimo,
MAX(total) AS pedido_maximo
FROM orders
WHERE fecha >= '2024-01-01';
-- GROUP BY: agrupar por una columna
-- Ventas por categoría de producto
SELECT
p.categoria,
COUNT(oi.id) AS unidades_vendidas,
SUM(oi.precio * oi.cantidad) AS ingresos,
AVG(oi.precio) AS precio_promedio
FROM order_items oi
INNER JOIN products p ON p.id = oi.product_id
GROUP BY p.categoria
ORDER BY ingresos DESC;
-- GROUP BY múltiple
SELECT
DATE_TRUNC('month', fecha) AS mes,
p.categoria,
SUM(oi.cantidad) AS unidades
FROM orders o
JOIN order_items oi ON oi.order_id = o.id
JOIN products p ON p.id = oi.product_id
GROUP BY DATE_TRUNC('month', fecha), p.categoria
ORDER BY mes, unidades DESC;
-- HAVING: filtrar grupos (WHERE filtra filas, HAVING filtra grupos)
-- Categorías con más de 100 unidades vendidas Y más de 5000 en ingresos
SELECT
p.categoria,
COUNT(*) AS ventas,
SUM(oi.precio * oi.cantidad) AS ingresos
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.categoria
HAVING COUNT(*) > 100 AND SUM(oi.precio * oi.cantidad) > 5000
ORDER BY ingresos DESC;
ConsejoRegla clave: en un SELECT con GROUP BY, solo puedes incluir columnas que estén en el GROUP BY o dentro de funciones agregadas. Si agregas otra columna, PostgreSQL te dará un error.
Practica esta lección
Resuelve los ejercicios del curso de SQL y Bases de Datos en la app, gratis y con corrección automática.
Empezar a practicar