← 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