Obtener ventas con cliente, item, producto, categoría y precio vigente.
SELECT o.OrdenID, o.Fecha, c.Nombre AS Cliente,
p.Nombre AS Producto, cat.Nombre AS Categoria,
ph.Precio
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
JOIN Categorias cat ON p.CategoriaID = cat.CategoriaID
LEFT JOIN PriceHistory ph
ON ph.ProductoID = p.ProductoID
AND o.Fecha BETWEEN ph.VigenciaDesde AND ph.VigenciaHasta;
SELECT *
FROM Ordenes o
WHERE Fecha = (
SELECT MAX(Fecha)
FROM Ordenes
WHERE ClienteID = o.ClienteID
);
SELECT ClienteID, Fecha,
SUM(Total) OVER (PARTITION BY ClienteID ORDER BY Fecha) AS Acumulado,
Total - LAG(Total) OVER (PARTITION BY ClienteID ORDER BY Fecha) AS Variacion
FROM Ordenes;
WITH Fechas AS (
SELECT
Fecha,
DATE_SUB(Fecha, INTERVAL ROW_NUMBER() OVER (ORDER BY Fecha) DAY) AS Grupo
FROM Ordenes
)
SELECT
MIN(Fecha) AS Inicio,
MAX(Fecha) AS Fin
FROM Fechas
GROUP BY Grupo
ORDER BY Inicio;
SELECT p.ProductoID, p.Nombre, ph.Precio
FROM Productos p
JOIN PriceHistory ph
ON ph.ProductoID = p.ProductoID
AND CURRENT_DATE BETWEEN ph.VigenciaDesde AND ph.VigenciaHasta;
DELETE FROM Transacciones t
WHERE t.ctid NOT IN (
SELECT MIN(ctid)
FROM Transacciones
GROUP BY ClienteID, Fecha, Monto
);
SELECT
a.ProductoID,
a.Stock AS StockA,
b.Stock AS StockB
FROM InventarioA a
LEFT JOIN InventarioB b ON a.ProductoID = b.ProductoID
WHERE COALESCE(a.Stock,0) != COALESCE(b.Stock,0)
UNION
SELECT
b.ProductoID,
a.Stock AS StockA,
b.Stock AS StockB
FROM InventarioB b
LEFT JOIN InventarioA a ON a.ProductoID = b.ProductoID
WHERE COALESCE(a.Stock,0) != COALESCE(b.Stock,0);
SELECT Region,
SUM(CASE WHEN Mes = 1 THEN Total END) AS Enero,
SUM(CASE WHEN Mes = 2 THEN Total END) AS Febrero,
SUM(CASE WHEN Mes = 3 THEN Total END) AS Marzo
FROM (
SELECT Region,
EXTRACT(MONTH FROM Fecha) AS Mes,
Total
FROM Ordenes o
JOIN Sucursales s ON o.SucursalID = s.SucursalID
) t
GROUP BY Region;
UPDATE Clientes
SET Nombre = INITCAP(TRIM(REPLACE(Nombre,' ',' ')));
Consultas lentas:
SELECT *
FROM Ordenes
WHERE ClienteID IN (SELECT ClienteID FROM Clientes WHERE Activo = TRUE);
Optimizada:
SELECT o.*
FROM Ordenes o
JOIN Clientes c ON o.ClienteID = c.ClienteID
WHERE c.Activo = TRUE;
-- EVITAR funciones sobre columnas indexadas:
-- NO: WHERE DATE(Fecha) = '2023-10-01'
-- SÍ:
WHERE Fecha >= '2023-10-01'
AND Fecha < '2023-10-02';
EXPLAIN SELECT * FROM Ordenes
WHERE Total > 5000;
→ Crear índice:
CREATE INDEX idx_ordenes_total ON Ordenes(Total);