← 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