Saltar al contenido principal
eLearner.app
Módulo 14 · Lección 2 de 354/57 en el curso~15 min
Lecciones del módulo (2/3)

CTEs múltiples y encadenadas

CTE múltiples y encadenados

La elegancia de las expresiones CON realmente brilla cuando encadenas varias. Puedes definir muchos CTE seguidos, separándolos con una coma.

Y aquí hay algo que les encanta a los puristas de la refactorización: los CTE posteriores pueden leer datos de CTE anteriores, descomprimiendo cálculos secuenciales pieza por pieza.

Ejemplo de CTE múltiple

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
),
top_customers AS (
  SELECT * FROM premium_customers
  WHERE total_spent > 5000
)
SELECT c.first_name, tc.total_spent
FROM customers c
JOIN top_customers tc ON c.id = tc.customer_id;

¡Es programación estilo bloque! Cada bloque hace solo un trabajo.

Ejercicio#sql.m14.l2.e1
Intentos: 0Cargando...

Defina dos CTE secuenciales: 1) 'order_totals' calcula 'customer_id' y el 'order_count' colocado usando `COUNT(*)` de 'orders'. 2) 'gold_users' lee desde 'order_totals' filtrando clientes con 'order_count >= 2'. Finalmente, ÚNASE a la tabla 'clientes' (extrayendo 'first_name' y 'last_name') con 'gold_users' (ON c.id = g.customer_id), y también muestra su 'order_count'.

Cargando editor...
Mostrar pista

Separe order_totals y gold_users con una coma (¡sin segundo CON!)

Solución disponible después de 3 intentos

Ejercicio#sql.m14.l2.e2
Intentos: 0Cargando...

Ahora usemos múltiples CTE para simplificar las métricas: cree 'max_price' (extrae una sola fila con 'max_value' usando `MAX(unit_price)` de 'order_items'). En la consulta principal, extraiga cada 'product_id' y 'unit_price' de 'order_items' y muestre cuánto difiere del precio máximo, calculando '(SELECT max_value FROM max_price) - unit_price AS diferencia'. No unirse: utilice una subconsulta en el CTE para obtener un valor único.

Cargando editor...
Mostrar pista

CON max_price AS (...) SELECCIONE product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;

Solución disponible después de 3 intentos