DÍA 24Subconsultas y CTE · SQL para Análisis de Datos

Separa el resumen de pagos por cliente usando una expresión WITH temporal.

Día 24 20 minIntermedio

Organizar un análisis con un CTE

Objetivos

Vas a nombrar el resumen de pagos y luego combinarlo con los nombres de clientes para presentar un resultado legible.

Concepto

CTE es la sigla en inglés de Common Table Expression; en español, expresión de tabla común. Es un resultado de consulta con nombre que puedes usar en la misma instrucción SQL. Piensa en él como un paso rotulado dentro de una receta: ayuda a separar y leer una consulta por etapas.

En MySQL se escribe con WITH nombre AS (...): WITH inicia el paso, el nombre identifica el resultado y los paréntesis contienen la consulta que lo calcula. La consulta principal puede leer ese nombre como si fuera una tabla. El CTE deja de estar disponible al terminar esa instrucción y no crea una tabla permanente; usarlo tampoco hace que una consulta sea automáticamente más rápida.

Aquí customer_totals cuenta y suma los pagos de payment por customer_id. GROUP BY produce una fila por cliente que tiene al menos un pago. Luego la consulta principal une ese resumen con customer para añadir nombres legibles.

Ejemplo

WITH customer_totals AS (
  SELECT
    customer_id,
    COUNT(*) AS payment_count,
    ROUND(SUM(amount), 2) AS total_paid
  FROM payment
  GROUP BY customer_id
)
SELECT
  c.customer_id,
  c.first_name,
  c.last_name,
  t.payment_count,
  t.total_paid
FROM customer_totals AS t
INNER JOIN customer AS c
  ON c.customer_id = t.customer_id
ORDER BY t.total_paid DESC, c.customer_id ASC
LIMIT 10;

El bloque entre paréntesis construye el resumen; después del ), la consulta principal lo usa con el alias t y lo une a customer mediante la clave customer_id. El resultado tiene una fila por cliente con pagos, ordenada del total más alto al más bajo y limitada a diez filas. El desempate por identificador hace estable el orden cuando dos totales son iguales. Los clientes sin pagos no aparecen porque no tienen una fila en payment para entrar al resumen.

Práctica guiada

  1. Cambia el nombre customer_totals por payments_by_customer en los dos lugares.
  2. Añade AVG(amount) al CTE y explica qué columnas siguen disponibles en la consulta principal.
  3. Quita el LIMIT y describe el tamaño esperado del resultado sin fijar una cifra.

Reto

Construye un CTE que resuma por staff_id la cantidad de pagos y el importe total. En la consulta principal muestra solo ese resumen y ordénalo por importe descendente. No unas tablas que no necesitas.

Quiz

¿Qué ocurre con customer_totals después de ejecutar la instrucción?

  • A. Queda guardado como tabla permanente.
  • B. Existe solo dentro de esa instrucción SQL.
  • C. Se convierte en una vista del servidor.

Respuesta: B. Un CTE tiene alcance dentro de una sola instrucción.

Comprobación

Ya separas una consulta en pasos con nombre. En esta unidad vas a comparar ese patrón con subconsultas y decidir cuál hace más clara cada pregunta.

TU PROGRESO

Cargando estado…