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;