← Volver

Ejercicios SQL — (Básico + Intermedio + Avanzado)

SELECT Básico

Ejercicio 1

Obtener todos los clientes cuyo país sea 'Argentina'.

SELECT * FROM Clientes 
WHERE Pais = 'Argentina';

Ejercicio 2

Listar OrdenItems con eñ Total esté entre 100 y 300.

SELECT * FROM OrdenItems 
WHERE Total BETWEEN 100 AND 300;

Ejercicio 3

Obtener las 10 órdenes más recientes.

SELECT * FROM Ordenes 
ORDER BY Fecha DESC 
LIMIT 10;

Funciones de Agregación

Ejercicio 1

Total de ventas por cliente.

SELECT ClienteID, SUM(Total) AS TotalVendido
FROM Ordenes
GROUP BY ClienteID;

Ejercicio 2

Promedio de total por ItemID.

SELECT itemID, AVG(Total) AS TotalPromedio 
FROM OrdenItems 
GROUP BY itemID;

Ejercicio 3

ItemID con ventas totales superiores a 200.

SELECT ItemID, SUM(Total) AS TotalVentas 
FROM ordenitems 
GROUP BY ItemID 
HAVING SUM(Total) > 200;

JOINs

INNER JOIN

SELECT c.Nombre, o.Fecha, o.Total
FROM Clientes c
INNER JOIN Ordenes o ON c.ClienteID = o.ClienteID;

LEFT JOIN

SELECT p.Nombre, d.Cantidad 
FROM Productos p 
LEFT JOIN ordenitems d ON p.ProductoID = d.ProductoID;

UNION ALL

SELECT ProductoID, Stock
FROM inventarioA
UNION ALL
SELECT ProductoID, Stock
FROM inventarioB;

Subconsultas

Ejercicio 1

Productos más caros que el precio promedio.

SELECT *
FROM Productos
WHERE Precio > (SELECT AVG(Precio) FROM Productos);

Ejercicio 2

Clientes que hicieron más de 5 órdenes.

SELECT ClienteID
FROM Ordenes
GROUP BY ClienteID
HAVING COUNT(*) > 5;

CTE (Common Table Expressions)

Ejercicio 1 — Totales por mes

WITH VentasMensuales AS (
  SELECT DATE_TRUNC('month', Fecha) AS Mes, SUM(Total) AS TotalMes
  FROM Ordenes
  GROUP BY DATE_TRUNC('month', Fecha)
)
SELECT * FROM VentasMensuales;

Ejercicio 2 — CTE Recursivo (Categorías jerárquicas)

WITH RECURSIVE CategoriasCTE AS (
  SELECT CategoriaID, Nombre, PadreID
  FROM Categorias
  WHERE PadreID IS NULL
  UNION ALL
  SELECT c.CategoriaID, c.Nombre, c.PadreID
  FROM Categorias c
  INNER JOIN CategoriasCTE cc ON c.PadreID = cc.CategoriaID
)
SELECT * FROM CategoriasCTE;

Window Functions

Ejercicio 1 — Ranking

SELECT ProductoID, Precio,
RANK() OVER (ORDER BY Precio DESC) AS Posicion
FROM Productos;

Ejercicio 2 — Ventas acumuladas

SELECT Fecha, Total,
SUM(Total) OVER (ORDER BY Fecha) AS Acumulado
FROM Ordenes;

Ejercicio 3 — Diferencia con mes anterior

SELECT Fecha, Total,
Total - LAG(Total, 1) OVER (ORDER BY Fecha) AS Variacion
FROM Ordenes;

Ejercicios Avanzados

Ejercicio 1 — Pivot Manual

SELECT ClienteID,
SUM(CASE WHEN EXTRACT(month FROM Fecha)=1 THEN Total END) AS Enero,
SUM(CASE WHEN EXTRACT(month FROM Fecha)=2 THEN Total END) AS Febrero
FROM Ordenes
GROUP BY ClienteID;

Ejercicio 2 — Detectar gaps de fechas

SELECT Fecha,
LAG(Fecha) OVER (ORDER BY Fecha) AS FechaAnterior,
Fecha - LAG(Fecha) OVER (ORDER BY Fecha) AS Diferencia
FROM Ordenes;

Dataset de ejemplo

Tablas modelo para todos los ejercicios:

  • Clientes (ClienteID, Nombre, Pais, Activo)
  • Productos (ProductoID, Nombre, CategoriaID)
  • Categorias (CategoriaID, Nombre, PadreID)
  • Ordenes (OrdenID, ClienteID, Fecha, Total, SucursalID)
  • OrdenItems (ItemID, OrdenID, ProductoID, Cantidad, Total)
  • InventarioA / InventarioB (ProductoID, Stock)
whatsapp