CTEs con WITH
Las Common Table Expressions (CTEs) te permiten definir "tablas temporales" con nombre al
inicio de tu consulta usando WITH. Son la alternativa moderna y legible a las subconsultas
anidadas. En equipos profesionales, las CTEs son el estándar.
Concepto teórico
¿Qué es una CTE?
Una CTE es un SELECT con nombre que definís al inicio con WITH y después usás como si fuera una
tabla:
WITH resumen_ciudad AS (
SELECT ciudad, SUM(saldo) AS total, COUNT(*) AS cantidad
FROM clientes
GROUP BY ciudad
)
SELECT ciudad, total, cantidad
FROM resumen_ciudad
WHERE total > 300000;
Múltiples CTEs
Podés definir varias CTEs separadas por coma, y cada una puede referenciar las anteriores:
WITH
saldos AS (
SELECT cliente_id, SUM(saldo) AS total
FROM cuentas GROUP BY cliente_id
),
clasificados AS (
SELECT c.nombre, s.total,
CASE WHEN s.total > 500000 THEN 'Alto' ELSE 'Normal' END AS segmento
FROM clientes c JOIN saldos s ON c.id = s.cliente_id
)
SELECT segmento, COUNT(*), AVG(total)
FROM clasificados
GROUP BY segmento;
datos_crudos → limpieza → agrupación → resultado.
saldos_por_cliente, no tmp1. (2) Cada CTE hace UNA operación. (3) La consulta final al
fondo es simple y legible.
Ejemplos explicados paso a paso
Ejemplo 1: CTE básica — reemplazar subconsulta en FROM
Hacé clic en ▶ Ejecutar
Ejemplo 2: Múltiples CTEs — pipeline de datos
Hacé clic en ▶ Ejecutar
Ejemplo 3: CTE para comparar con promedios
Hacé clic en ▶ Ejecutar
Ejemplo 4: CTE para reporte gerencial
Hacé clic en ▶ Ejecutar
Ejemplo 5: CTE recursiva — generar secuencia de meses
Hacé clic en ▶ Ejecutar
Referencia rápida
| Patrón | Sintaxis |
|---|---|
| CTE simple | WITH nombre AS (SELECT ...) SELECT ... FROM nombre |
| Múltiples CTEs | WITH a AS (...), b AS (...) SELECT ... FROM b |
| CTE recursiva | WITH RECURSIVE n AS (base UNION ALL paso) SELECT ... |
| CTE + JOIN | Usá la CTE como cualquier tabla en un JOIN |
Ejercicios
Ejercicio 1: CTE simple
Creá una CTE que agrupe por ciudad y después filtrá ciudades con total > $300K. Debe incluir
Buenos Aires.
Hacé clic en ▶ Ejecutar
Ejercicio 2: CTE con promedio
Usá una CTE para calcular el promedio y después mostrá clientes por encima de ese promedio. Debe incluir
Pérez.
Hacé clic en ▶ Ejecutar
Ejercicio 3: CTE con conteo
CTE que cuente clientes por ciudad y muestre solo las que tengan 2+. Debe incluir 2.
Hacé clic en ▶ Ejecutar
Ejercicio 4: Múltiples CTEs
CTE 1: saldo total por cliente (JOIN cuentas). CTE 2: clasificar en Alto/Normal. Consulta final: listar. Debe
incluir Alto.
Hacé clic en ▶ Ejecutar
Ejercicio 5: CTE + % del total
CTE con total general. Consulta principal muestra cada cliente con su %. Debe incluir pct.
Hacé clic en ▶ Ejecutar
Ejercicio 6: CTE recursiva — secuencia
Generá una secuencia del 1 al 6 representando cuotas de un préstamo. Debe incluir Cuota.
Hacé clic en ▶ Ejecutar
Ejercicio 7: Pipeline de 3 CTEs
CTE1: saldos por cliente. CTE2: promedio general. CTE3: comparación. Final: los que superan el promedio. Debe
incluir encima.
Hacé clic en ▶ Ejecutar
Ejercicio 8: CTE + LEFT JOIN para penetración
CTE con clientes y cuentas. Mostrar penetración por ciudad. Debe incluir penetracion.
Hacé clic en ▶ Ejecutar
Ejercicio 9: CTE para ranking
CTE que ordene clientes por saldo y muestre top 3. Debe incluir ranking.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Dashboard ejecutivo completo con CTEs
Construí un dashboard con 3 CTEs: base de datos completa, estadísticas por ciudad, y clasificación. Mostrá el
resumen final con totales y porcentajes. Debe incluir DASHBOARD.
Hacé clic en ▶ Ejecutar
Resumen y conexión
WITH nombre AS (SELECT ...)define una CTE — tabla temporal con nombre.- Múltiples CTEs:
WITH a AS (...), b AS (...)— cada una puede usar las anteriores. - Las CTEs son más legibles que subconsultas anidadas — estándar en equipos profesionales.
WITH RECURSIVEgenera secuencias y recorre estructuras jerárquicas.- CTE + JOIN + GROUP BY + CASE WHEN = reporte gerencial completo y mantenible.
En la siguiente lección (11 · Window Functions) vas a aprender ROW_NUMBER, RANK, LAG/LEAD y funciones de ventana — las herramientas más avanzadas de SQL para análisis.