SQL Intermedio · Lección 5 de 6

WITH: resolver por pasos

Las preguntas difíciles se resuelven por partes. Con WITH armás pasos con nombre, como tablas intermedias, y la consulta se lee de arriba hacia abajo.

5 minutos
paso 1respuesta

Una tabla intermedia, sin copiar y pegar

Pensá en cómo lo harías en una planilla: primero armás una hoja con el total de cada cliente y después, sobre esa hoja, buscás a los mejores. En SQL eso se hace con WITH. Le ponés nombre a un paso (se le dice CTE) y después lo usás como si fuera una tabla más.

WITH facturacion AS (
  SELECT  c.nombre,
          SUM(v.cantidad * p.precio) AS total
  FROM ventas v
  JOIN clientes c ON v.cliente_id = c.id
  JOIN productos p ON v.producto_id = p.id
  GROUP BY c.nombre
)
SELECT  nombre,
        total
FROM facturacion
WHERE total > 30000;

Se lee de arriba hacia abajo: paso 1, armá facturacion con el total de cada cliente; paso 2, de facturacion, traé los que superan $30.000. Cada parte se entiende sola, y si algo no da, revisás paso por paso.

La estructuraWITH nombre AS ( … )→SELECT … FROM nombre

¿No podía hacerlo sin WITH?

Muchas veces sí, pero la consulta queda larga y difícil de leer. WITH no hace nada que no puedas hacer de otra forma: lo que cambia es que la persona que la lee la entiende, incluida vos dentro de tres meses. Y se pueden encadenar varios pasos separados por comas: WITH paso1 AS (…), paso2 AS (…).

Un detalle: el paso existe solo mientras corre la consulta. No se guarda en la base ni crea ninguna tabla nueva.

Actividad 1

Armá la consulta por pasos

Pregunta: "¿qué clientes compraron 10 veces o más?". Primero se arma el paso con las compras de cada cliente y después se filtra. Tocá las piezas en orden.

Actividad 2

Los mejores clientes

Tres misiones por pasos. El editor ya trae el paso facturacion armado: ejecutalo para empezar.

Columnas de ventas:idINTEGERfechaDATEcliente_idINTEGERproducto_idINTEGERsucursal_idINTEGERcantidadINTEGER
Columnas de productos:idINTEGERnombreTEXTcategoriaTEXTprecioREALstockINTEGER
Columnas de clientes:idINTEGERnombreTEXTbarrioTEXTtelefonoTEXT
  1. 1Con WITH, armá un paso llamado facturacion con el nombre de cada cliente y su total facturado. Después mostrá todo lo que tiene.
  2. 2Usando ese mismo paso, mostrá los 3 clientes que más facturaron, del mayor al menor (nombre y total).
  3. 3Armá un paso con cuántas veces compró cada cliente y, con un CASE, contá cuántos son 'frecuente' (10 compras o más) y cuántos 'ocasional'.

Tu misión, las tablas, los mensajes y la ayuda están en el panel de la izquierda.

almacen.dbproductosclientessucursalesventasstock_diario
o Ctrl + Enter

Tocá Ejecutar para ver el resultado.

Chequeo rápido

Después de ejecutar una consulta con WITH, ¿qué pasa con el paso que armaste?

Que la IA te explique una consulta larga, paso por paso

En el trabajo te vas a encontrar consultas de muchas líneas. Pedile a Gemini que te las traduzca:

Explicame esta consulta paso por paso, primero cada WITH y después el SELECT final, como si fuera la primera vez que leo SQL: [pegá acá la consulta]

Que te la explique no reemplaza entenderla: después ejecutala vos y mirá cada paso por separado.

Para llevarte: WITH nombre AS (…) arma un paso intermedio que después usás como una tabla. Sirve para resolver preguntas grandes por partes y para que la consulta se lea de arriba hacia abajo.

Ya resolvés problemas por pasos

¿Listo para la próxima lección?