← Volver

Ejercicios SQL — Nivel Intermedio

JOINs Intermedios

1) INNER JOIN de 3 tablas

Obtener órdenes con nombre de cliente y nombre de producto.

SELECT 
    o.OrdenID, 
    c.ClienteID AS Clientes, 
    p.Nombre AS Productos, 
    i.Total
FROM Ordenes o
JOIN Clientes c ON o.ClienteID = c.ClienteID
JOIN ordenitems i ON o.OrdenID = i.OrdenID
JOIN Productos p ON i.ProductoID = p.ProductoID;

2) LEFT JOIN para ver clientes sin órdenes

SELECT c.ClienteID, c.Nombre, o.OrdenID
FROM Clientes c
LEFT JOIN Ordenes o ON c.ClienteID = o.ClienteID;

3) JOIN + cálculos

Mostrar monto total por producto vendido.

SELECT p.Nombre, 
SUM(i.Total) AS TotalVendido 
FROM Productos p 
JOIN ordenitems i 
ON p.ProductoID = i.ProductoID 
GROUP BY p.Nombre;

GROUP BY y HAVING

1) Ventas por cliente

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

2) Clientes con más de 5 órdenes

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

3) Productos con promedio de venta mayor a 200

SELECT ProductoID, AVG(Total) AS Promedio FROM ordenitems GROUP BY ProductoID HAVING AVG(Total) > 200;

Subconsultas Intermedias

1)OrdenItems con total mayor al promedio

SELECT * 
FROM OrdenItems 
WHERE Total > (SELECT AVG(Total) FROM OrdenItems);

2) Clientes con su última compra

SELECT *
FROM Ordenes o
WHERE Fecha = (
  SELECT MAX(Fecha)
  FROM Ordenes
  WHERE ClienteID = o.ClienteID
);

3) Mostrar órdenes cuyos totales sean mayores al total promedio del sistema

SELECT *
FROM Ordenes
WHERE Total > (SELECT AVG(Total) FROM Ordenes);

CTE Intermedio

1) Ventas por mes

WITH Ventas AS (
    SELECT 
        DATE_FORMAT(Fecha, '%Y-%m-01') AS Mes,
        SUM(Total) AS TotalMes
    FROM Ordenes
    GROUP BY DATE_FORMAT(Fecha, '%Y-%m-01')
)
SELECT * FROM Ventas;

2) Productos más vendidos (top 5)

SELECT ProductoID, SUM(Cantidad) AS TotalCantidad
FROM ordenitems
GROUP BY ProductoID
ORDER BY TotalCantidad DESC
LIMIT 5;

3) Ordenes con total acumulado por fecha

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

SELECT * FROM OrdenesConAcumulado;

Dataset Base (Tablas usadas)

  • Clientes (ClienteID, Nombre, Pais, Activo)
  • Productos (ProductoID, Nombre, CategoriaID)
  • Ordenes (OrdenID, ClienteID, Fecha, Total, SucursalID)
  • OrdenItems (ItemID, OrdenID, ProductoID, Cantidad, Total)
whatsapp