Digamos que tengo las siguientes tablas:
1 - Stock Inicial :
vendor | starting_stock ------------------------ adidas | 13 Reebok | 5
2 - Reponer :
vendor | restocks ----------------- adidas | 2 nike | 3
3 - Ventas :
vendor | quantity_sold ---------------------- adidas | 10 nike | 1
Quiero que mi tabla resultante sea la venta agrupada por proveedor. En este escenario, la venta directa se calcula así: quantity_sold/(starting_stock + restocks)
. Mi único problema es que es posible que las tablas de stock inicial y reabastecimiento no tengan algunos proveedores que están presentes en la tabla de ventas. Entonces, en el escenario anterior, StartingStock
no tiene nike
como registro. Entonces, si ese es el caso, la venta de nike sería solo 1/3
o 1/(3+0)
. Por lo tanto, mi tabla resultante sería:
vendor | sell_through --------------------- adidas | 1.5 nike | 0.33 Reebok | 0
Por lo tanto, me gustaría que todos los proveedores estuvieran presentes en la tabla de resultados (si no tiene ventas, el valor es 0, como se muestra arriba en Reebok).
Traté de trabajar con los diferentes tipos de uniones pero no pude conseguirlo. Cualquier ayuda sería genial. Gracias.
Podemos probar un enfoque de unión externa completa aquí:
SELECT COALESCE(ss.vendor, r.vendor, s.vendor) AS vendor, COALESCE(s.quantity_sold, 0) / (COALESCE(ss.starting_stock, 0) + COALESCE(r.restocks, 0)) AS sell_through FROM StartingStock ss FULL OUTER JOIN Restock r ON ss.vendor = r.vendor FULL OUTER JOIN Sales s ON s.vendor = COALESCE(ss.vendor, r.vendor)
Tenga en cuenta que obtengo 2/3 para la venta directa de Adidas, ya que la cantidad vendida es 10 y la suma de las existencias es 15.
Yo usaría union all
y agregación:
select vendor, sum(starting_stock), sum(restock), sum(quantity_sold), (sum(quantity_sold) * 1.0 / sum(starting_stock) + sum(restock)) as sell_through from ((select vendor, starting_stock, 0 as restock, 0 as quantity_sold from startingstock ) union all (select vendor, 0 as starting_stock, restock, 0 as quantity_sold from restock ) union all (select vendor, 0 as starting_stock, 0 as restock, quantity_sold from sales ) ) v group by vendor;
En particular, esta versión incluye cada número en el cálculo solo una vez. Un enfoque JOIN
producirá resultados inexactos si un proveedor tiene varias filas en cualquiera de las tablas.