QuieroProgramar por Rodri Gonzalez
SQL · Lección 10 de 15

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.

80–100 min Prerrequisitos: SQL 09
01

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;
CTE vs Subconsulta: hacen lo mismo, pero las CTEs son mucho más legibles. En vez de anidar paréntesis, definís cada paso con un nombre descriptivo arriba y los usás abajo. Es como definir funciones en Python antes de usarlas.

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;
En el trabajo: las CTEs son el estándar en Databricks, BigQuery y cualquier motor moderno. Cuando escribís una consulta de 50+ líneas con 3 subconsultas anidadas, nadie la entiende. Con CTEs, cada paso tiene un nombre y se lee como un pipeline: datos_crudos → limpieza → agrupación → resultado.
Buenas prácticas con CTEs: (1) Nombralas descriptivamente: saldos_por_cliente, no tmp1. (2) Cada CTE hace UNA operación. (3) La consulta final al fondo es simple y legible.
02

Ejemplos explicados paso a paso

Ejemplo 1: CTE básica — reemplazar subconsulta en FROM

ejemplo_01_cte.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: Múltiples CTEs — pipeline de datos

ejemplo_02_multi.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: CTE para comparar con promedios

ejemplo_03_promedios.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: CTE para reporte gerencial

ejemplo_04_reporte.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: CTE recursiva — generar secuencia de meses

ejemplo_05_recursiva.sqlSQL

        
Hacé clic en ▶ Ejecutar
03

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
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: CTE simple

Creá una CTE que agrupe por ciudad y después filtrá ciudades con total > $300K. Debe incluir Buenos Aires.

ejercicio_01.sqlDebe incluir "Buenos Aires"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

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.

ejercicio_02.sqlDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: CTE con conteo

CTE que cuente clientes por ciudad y muestre solo las que tengan 2+. Debe incluir 2.

ejercicio_03.sqlDebe incluir "2"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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.

ejercicio_04.sqlDebe incluir "Alto"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: CTE + % del total

CTE con total general. Consulta principal muestra cada cliente con su %. Debe incluir pct.

ejercicio_05.sqlDebe incluir "pct"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: CTE recursiva — secuencia

Generá una secuencia del 1 al 6 representando cuotas de un préstamo. Debe incluir Cuota.

ejercicio_06.sqlDebe incluir "Cuota"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_07.sqlDebe incluir "encima"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: CTE + LEFT JOIN para penetración

CTE con clientes y cuentas. Mostrar penetración por ciudad. Debe incluir penetracion.

ejercicio_08.sqlDebe incluir "penetracion"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: CTE para ranking

CTE que ordene clientes por saldo y muestre top 3. Debe incluir ranking.

ejercicio_09.sqlDebe incluir "ranking"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

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.

ejercicio_10.sqlDebe incluir "DASHBOARD"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

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.