Módulo 8 · Integración

Comprueba lo aprendido y prepara tu repaso

Resuelve ejercicios de todo el curso y recibe una recomendación para continuar.

45–60 minNivel EvaluaciónAntes necesitas: Proyecto biblioteca

0 de 45 lecciones

Al terminar, podrás

  • Interpretar y escribir consultas acumulativas.
  • Diagnosticar errores de lógica, no solo de sintaxis.
  • Convertir tus fallos en una ruta de repaso concreta.

Recupera lo aprendido: Sin abrir soluciones, explica para qué usarías WHERE, GROUP BY, HAVING y LEFT JOIN.

La idea clave

La evaluación final mide transferencia: leer una pregunta, definir la unidad del resultado, construir la consulta por etapas y comprobarla. Reconocer una palabra SQL no basta si no puedes justificar por qué una fila aparece.

Registra el error: anota si fallaste al elegir tablas, relacionar claves, filtrar filas, agrupar, filtrar grupos u ordenar.

Protocolo de resolución

Lista de comprobación
-- 1. ¿Qué representa una fila?
-- 2. ¿Qué tablas y claves necesito?
-- 3. ¿Qué filtros actúan antes de agrupar?
-- 4. ¿Qué cálculos y grupos necesito?
-- 5. ¿Qué condición actúa sobre el grupo?
-- 6. ¿El orden debe ser determinista?

Ejemplo acumulativo

Calcula los ingresos no cancelados por categoría de producto. Una fila representa una categoría con más de 100 de ingresos.

Consulta resuelta
SELECT pr.categoria,
       COUNT(DISTINCT p.id) AS pedidos,
       ROUND(SUM(dp.cantidad * dp.precio_unitario), 2) AS ingresos
FROM detalle_pedido AS dp
JOIN pedidos AS p ON p.id = dp.pedido_id
JOIN productos AS pr ON pr.id = dp.producto_id
WHERE p.estado <> 'cancelado'
GROUP BY pr.categoria
HAVING SUM(dp.cantidad * dp.precio_unitario) > 100
ORDER BY ingresos DESC, pr.categoria;
Resultado esperado
categoriapedidosingresos
Ordenadores1999,00
Pantallas4786,00
Audio5307,70
Accesorios7295,20
Almacenamiento3267,00

Cómo se justifica

  1. El detalle aporta cantidad y precio unitario de cada línea.
  2. El pedido permite excluir operaciones canceladas antes del resumen.
  3. El producto aporta la categoría que define cada grupo.
  4. HAVING conserva únicamente categorías cuyo ingreso supera 100.
Comprueba tu comprensión

Una condición depende de SUM(total). ¿Dónde debe escribirse?

Un error habitual

Agregar una cabecera después de multiplicarla por sus líneas

Consulta que infla el total
SELECT p.id, SUM(p.total) AS total
FROM pedidos AS p
JOIN detalle_pedido AS dp ON dp.pedido_id = p.id
GROUP BY p.id;

El JOIN repite el total del pedido por cada línea. Si necesitas el total guardado en la cabecera, selecciona MAX(p.total); si quieres reconstruirlo, suma dp.cantidad * dp.precio_unitario.

Evaluación en el laboratorio

Laboratorio SQL

Resuelve la consulta

Pendiente

Calcula el importe de los pedidos no cancelados por cliente. Devuelve nombre y la suma con alias facturacion; conserva solo clientes cuya suma supere 100. No cambies los datos.

Resultado esperado: 6 filas con nombre, facturacion. El orden de las filas no importa.

Ver tablas y datos

Cargando la estructura del ejercicio…

La consulta usa datos ficticios y se ejecuta solo en este navegador.

Bloques de evaluación autónoma

1. Interpretar

Sin ejecutar, explica qué representa una fila de la consulta resuelta y por qué se usa COUNT(DISTINCT p.id).

Ver criterio de corrección

Una fila representa una categoría de producto. COUNT(DISTINCT p.id) evita contar varias veces el mismo pedido cuando contiene más de una línea de la misma categoría.

2. Corregir

Corrige una consulta que intenta mostrar categorías con precio medio superior a 100:

Consulta con error
SELECT categoria, AVG(precio) AS media
FROM productos
WHERE AVG(precio) > 100
GROUP BY categoria;
Ver la solución
Consulta corregida
SELECT categoria, AVG(precio) AS media
FROM productos
GROUP BY categoria
HAVING AVG(precio) > 100;

HAVING puede evaluar la media del grupo. WHERE solo ve filas individuales.

3. Diseñar

Escribe una consulta que muestre cada categoría y cuántos productos sin stock contiene, incluido cero. Explica por qué el filtro stock = 0 pertenece a ON.

Ver una solución posible
Solución SQL
SELECT c.nombre AS categoria,
       COUNT(p.id) AS sin_stock
FROM categorias AS c
LEFT JOIN productos AS p
  ON p.categoria_id = c.id
 AND p.stock = 0
GROUP BY c.id, c.nombre
ORDER BY c.nombre;

El filtro dentro de ON limita las coincidencias a productos sin stock sin eliminar categorías. COUNT(p.id) devuelve cero cuando no existe coincidencia.

Plan de repaso

Decide qué necesitas repasar

  • Ya lo dominas: resuelves el laboratorio y los tres bloques autónomos sin abrir soluciones y justificas filtros, grupos y coincidencias ausentes.
  • Necesitas consolidarlo: llegas al resultado con pistas. Repite ese bloque mañana con las respuestas cerradas.
  • Necesitas volver a la base: no puedes explicar qué representa una fila o por qué una fila desaparece. Usa el plan de repaso de arriba y resuelve primero la práctica de ese tema.

Esta autoevaluación no es una nota automática ni una certificación. Utiliza el resultado para elegir tu siguiente práctica.

Comprueba si puedes explicarlo

¿Dar el resultado correcto con estos datos basta para demostrar que una consulta responde bien a la pregunta?

Ver respuesta razonada

No. Justifica también qué pasaría con empates, valores NULL, filas sin coincidencia y varias coincidencias. Si tu razonamiento falla en uno de esos casos, repasa la lección correspondiente.

Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.

Qué debes recordar

  • Define la unidad del resultado antes de escribir.
  • Comprueba cardinalidad, nulos y orden, no solo que la consulta se ejecute.
  • Convierte cada error en un repaso dirigido.

Siguiente paso: elige una ruta por objetivo o repite los bloques donde todavía necesites pistas.

Fuentes técnicas consultadas

La evaluación usa consultas portables del curso. Comprueba en la documentación del motor las variantes de límites, fechas y cambios de esquema.

Conceptos relacionados