SQL Server

CTE en SQL Server (Common Table Expressions) explicado fácil con ejemplos reales y ejercicios

Publicado por J. Panduro hace 4 meses

CTE en SQL Server (Common Table Expressions) explicado fácil con ejemplos reales y ejercicios

A medida que tus consultas SQL crecen, empiezan a volverse difíciles de leer y mantener. Aquí es donde las CTE(Common Table Expressions) se convierten en una herramienta muy poderosa en SQL Server.


Las CTE permiten:

  1. Escribir consultas más limpias
  2. Organizar lógica compleja
  3. Reemplazar subconsultas difíciles
  4. Mejorar legibilidad

En este artículo aprenderás:

  1. Qué es una CTE
  2. Cómo funciona
  3. Diferencia entre CTE y subquery
  4. Casos reales empresariales
  5. Ejercicios tipo entrevista


¿Qué es una CTE?


Una CTE (Common Table Expression) es una consulta temporal con nombre que existe únicamente durante la ejecución de una consulta SQL. Su principal objetivo es mejorar la legibilidad y organización del código, permitiendo dividir consultas complejas en partes más fáciles de entender y mantener.


Una CTE se define utilizando la palabra clave WITH y funciona de manera similar a una tabla temporal o una vista, con la diferencia de que solo existe mientras se ejecuta la consulta que la utiliza. Una vez finalizada la ejecución, la CTE desaparece automáticamente y no ocupa espacio permanente en la base de datos.


Gracias a las CTEs, es posible estructurar consultas complejas de forma más clara, evitando subconsultas anidadas difíciles de leer. Esto resulta especialmente útil cuando se trabaja con grandes volúmenes de datos o cuando una consulta requiere múltiples etapas de procesamiento.


Ejemplo


WITH NombreCTE AS (
SELECT ...
)
SELECT * FROM NombreCTE;


¿Por qué usar CTE?


Las CTE ayudan a:


  1. Dividir consultas complejas
  2. Hacer código más entendible
  3. Evitar subconsultas repetidas


Dataset completo (copiar y ejecutar)


-- 1. Limpiar tabla
IF OBJECT_ID('Ventas', 'U') IS NOT NULL
DROP TABLE Ventas;

-- 2. Crear tabla
CREATE TABLE Ventas (
IdVenta INT IDENTITY(1,1) PRIMARY KEY,
Producto VARCHAR(100) NOT NULL,
Categoria VARCHAR(50) NOT NULL,
Cliente VARCHAR(100) NOT NULL,
Total DECIMAL(10,2) NOT NULL
);

-- 3. Insertar datos
INSERT INTO Ventas (Producto, Categoria, Cliente, Total)
VALUES
('Laptop', 'Tecnología', 'Juan Pérez', 2500.00),
('Mouse', 'Tecnología', 'Ana López', 80.00),
('Teclado', 'Tecnología', 'Juan Pérez', 150.00),
('Monitor', 'Tecnología', 'Carlos Ruiz', 900.00),
('Silla', 'Muebles', 'Ana López', 450.00),
('Escritorio', 'Muebles', 'Juan Pérez', 700.00),
('Tablet', 'Tecnología', 'Carlos Ruiz', 1200.00);


Primera CTE básica


Obtener clientes que gastaron más de 1000.


WITH TotalClientes AS (
SELECT
Cliente,
SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
)
SELECT *
FROM TotalClientes
WHERE TotalGastado > 1000;



¿Cómo funciona?


Paso 1


La CTE genera temporalmente:




Paso 2


Luego la consulta principal usa esa “tabla temporal”.


SELECT *
FROM TotalClientes
WHERE TotalGastado > 1000;


Diferencia entre CTE y Subquery


Tanto las CTE (Common Table Expressions) como las Subqueries (Subconsultas) permiten utilizar el resultado de una consulta dentro de otra consulta. Sin embargo, existen diferencias importantes en cuanto a legibilidad, mantenimiento y casos de uso.


Una Subquery es una consulta que se encuentra dentro de otra consulta SQL. Generalmente se utiliza para obtener datos que serán empleados por la consulta principal. Aunque son muy útiles, cuando una consulta contiene varias subconsultas anidadas puede volverse difícil de leer y mantener.


Por otro lado, una CTE permite asignar un nombre a una consulta temporal antes de ejecutar la consulta principal. Esto hace que el código sea más organizado y fácil de entender, especialmente en consultas complejas.


Subquery


SELECT *
FROM (
SELECT Cliente, SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
) AS Datos;


CTE


WITH Datos AS (
SELECT Cliente, SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
)
SELECT * FROM Datos;


¿Cuál es mejor?


La CTE suele ser:

  1. Más limpia
  2. Más legible
  3. Más fácil de mantener


Caso real empresarial


Obtener categorías con ventas superiores al promedio.


WITH VentasPorCategoria AS (
SELECT
Categoria,
SUM(Total) AS TotalVendido
FROM Ventas
GROUP BY Categoria
)
SELECT *
FROM VentasPorCategoria
WHERE TotalVendido > (
SELECT AVG(TotalVendido)
FROM VentasPorCategoria
);


CTE con múltiples cálculos


WITH ResumenClientes AS (
SELECT
Cliente,
COUNT(*) AS CantidadCompras,
SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
)
SELECT *
FROM ResumenClientes
ORDER BY TotalGastado DESC;


CTE recursiva (nivel más avanzado)


Además de simplificar consultas complejas, las CTE (Common Table Expressions) también pueden utilizarse de forma recursiva. Una CTE recursiva es aquella que se referencia a sí misma para recorrer estructuras jerárquicas o relaciones entre registros, permitiendo procesar datos organizados en varios niveles.


Este tipo de consultas resulta especialmente útil cuando la información tiene una estructura de árbol, donde un registro puede depender de otro registro padre. En lugar de realizar múltiples consultas manuales para recorrer cada nivel, una CTE recursiva permite obtener toda la jerarquía mediante una única consulta.


  1. Las CTE recursivas son ampliamente utilizadas en sistemas empresariales para representar relaciones jerárquicas y estructuras organizacionales complejas. Gracias a ellas es posible navegar fácilmente entre distintos niveles de información sin necesidad de escribir consultas repetitivas.


Ejemplo simple


WITH Numeros AS (
SELECT 1 AS Numero

UNION ALL

SELECT Numero + 1
FROM Numeros
WHERE Numero < 5
)
SELECT *
FROM Numeros;





Ejercicios tipo entrevista


Nivel básico


Obtener clientes que gastaron más de 1000 usando CTE.


WITH Clientes AS (
SELECT
Cliente,
SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
)
SELECT *
FROM Clientes
WHERE TotalGastado > 1000;


Nivel intermedio

Mostrar:

  1. Cliente
  2. Cantidad de compras
  3. Total gastado


WITH Resumen AS (
SELECT
Cliente,
COUNT(*) AS Compras,
SUM(Total) AS Gastado
FROM Ventas
GROUP BY Cliente
)
SELECT *
FROM Resumen;


Nivel entrevista real


Obtener categorías cuyo total vendido esté por encima del promedio general.


WITH Categorias AS (
SELECT
Categoria,
SUM(Total) AS TotalVendido
FROM Ventas
GROUP BY Categoria
)
SELECT *
FROM Categorias
WHERE TotalVendido > (
SELECT AVG(TotalVendido)
FROM Categorias
);


Conclusión


Las CTE (Common Table Expressions) son una herramienta poderosa de SQL Server que permite escribir consultas más claras, organizadas y fáciles de mantener. Aunque a simple vista pueden parecer similares a las subconsultas, ofrecen una estructura más legible que facilita el desarrollo y la comprensión de consultas complejas.


A lo largo de este artículo hemos visto cómo las CTE ayudan a dividir problemas complejos en partes más sencillas, permitiendo trabajar con conjuntos de datos de forma más ordenada. También aprendimos que pueden utilizarse para realizar cálculos intermedios, generar rankings, simplificar consultas extensas y construir soluciones más profesionales dentro de bases de datos empresariales.


Además, las CTE recursivas amplían aún más sus capacidades al permitir trabajar con estructuras jerárquicas como organigramas, categorías de productos, árboles de directorios y relaciones entre registros. Gracias a esta funcionalidad, es posible resolver problemas que de otra manera requerirían múltiples consultas o lógica adicional en la aplicación.


En entornos profesionales, las CTE son ampliamente utilizadas en sistemas ERP, aplicaciones web, plataformas de comercio electrónico, sistemas de gestión empresarial, dashboards y soluciones de análisis de datos. Su capacidad para mejorar la legibilidad y el mantenimiento del código las convierte en una herramienta indispensable para desarrolladores y administradores de bases de datos.

Sobre el autor

J. Panduro es desarrollador de software y creador de HPanduDigital. Comparte contenido sobre Desarrollo Web, inteligencia artificial, y transformación digital, basado en experiencias reales y proyectos prácticos.

Buscar artículos

Escribe al menos 2 caracteres para buscar.