Ejercicios – Módulo 2 (GROUP BY / HAVING)
20 ejercicios reales por niveles. Abre la solución solo después de intentar.
Nivel 1 – Básico (1–7)
GROUP BY + COUNT/SUM/AVG por una columna.
1) Total de productos por categoría
Solución
SELECT categoria, COUNT(*) AS total
FROM productos
GROUP BY categoria
ORDER BY total DESC;2) Stock total por categoría
Solución
SELECT categoria, SUM(stock) AS stock_total
FROM productos
GROUP BY categoria
ORDER BY stock_total DESC;3) Precio promedio por categoría
Solución
SELECT categoria, AVG(precio) AS promedio
FROM productos
GROUP BY categoria
ORDER BY promedio DESC;4) Precio mínimo y máximo por categoría
Solución
SELECT categoria, MIN(precio) AS min_precio, MAX(precio) AS max_precio
FROM productos
GROUP BY categoria;5) Clientes por ciudad
Solución
SELECT ciudad, COUNT(*) AS total_clientes
FROM clientes
GROUP BY ciudad
ORDER BY total_clientes DESC;6) Número de ciudades únicas
Solución
SELECT COUNT(DISTINCT ciudad) AS ciudades_unicas
FROM clientes;7) Categorías ordenadas alfabéticamente
Solución
SELECT categoria, COUNT(*) AS total
FROM productos
GROUP BY categoria
ORDER BY categoria ASC;Nivel 2 – Intermedio (8–15)
WHERE + GROUP BY + ORDER BY + HAVING.
8) Productos por categoría (solo stock > 0)
Solución
SELECT categoria, COUNT(*) AS total
FROM productos
WHERE stock > 0
GROUP BY categoria
ORDER BY total DESC;9) Stock total por categoría (solo Papelería y Accesorio)
Solución
SELECT categoria, SUM(stock) AS stock_total
FROM productos
WHERE categoria IN ('Papelería','Accesorio')
GROUP BY categoria
ORDER BY stock_total DESC;10) Categorías con stock total >= 50 (HAVING)
Solución
SELECT categoria, SUM(stock) AS stock_total
FROM productos
GROUP BY categoria
HAVING SUM(stock) >= 50
ORDER BY stock_total DESC;11) Categorías con al menos 3 productos (HAVING COUNT)
Solución
SELECT categoria, COUNT(*) AS total
FROM productos
GROUP BY categoria
HAVING COUNT(*) >= 3
ORDER BY total DESC;12) Categorías con precio promedio > 10
Solución
SELECT categoria, AVG(precio) AS promedio
FROM productos
GROUP BY categoria
HAVING AVG(precio) > 10
ORDER BY promedio DESC;13) Reporte de inventario: valor total aproximado por categoría (precio * stock)
Solución
SELECT categoria, SUM(precio * stock) AS valor_inventario
FROM productos
GROUP BY categoria
ORDER BY valor_inventario DESC;14) Categorías con valor de inventario > 500
Solución
SELECT categoria, SUM(precio * stock) AS valor_inventario
FROM productos
GROUP BY categoria
HAVING SUM(precio * stock) > 500
ORDER BY valor_inventario DESC;15) Ciudades con al menos 2 clientes
Solución
SELECT ciudad, COUNT(*) AS total_clientes
FROM clientes
GROUP BY ciudad
HAVING COUNT(*) >= 2
ORDER BY total_clientes DESC;Nivel 3 – Reto (16–20)
Reportes tipo negocio (ranking + filtros por grupos).
16) Top 3 categorías por stock total
Solución
SELECT categoria, SUM(stock) AS stock_total
FROM productos
GROUP BY categoria
ORDER BY stock_total DESC
LIMIT 3;Nota: Si usas SQL Server, reemplaza LIMIT por TOP.
17) Top 3 categorías por valor de inventario
Solución
SELECT categoria, SUM(precio * stock) AS valor_inventario
FROM productos
GROUP BY categoria
ORDER BY valor_inventario DESC
LIMIT 3;18) Categorías “críticas”: stock total <= 10
Solución
SELECT categoria, SUM(stock) AS stock_total
FROM productos
GROUP BY categoria
HAVING SUM(stock) <= 10
ORDER BY stock_total ASC;19) Categorías con variación de precio alta (max - min) >= 20
Solución
SELECT categoria,
MIN(precio) AS min_precio,
MAX(precio) AS max_precio,
(MAX(precio) - MIN(precio)) AS rango
FROM productos
GROUP BY categoria
HAVING (MAX(precio) - MIN(precio)) >= 20
ORDER BY rango DESC;20) Reporte final: categorías con (promedio > 10) y (stock_total >= 50)
Solución
SELECT categoria,
AVG(precio) AS promedio,
SUM(stock) AS stock_total
FROM productos
GROUP BY categoria
HAVING AVG(precio) > 10 AND SUM(stock) >= 50
ORDER BY promedio DESC;