Pregunta

Tengo dos tablas, una almacena los productos y la cantidad que hemos comprado y la otra la vende. El stock actual es, por lo tanto, la suma de todas las columnas de cantidad en la tabla comprada menos el número de filas en la tabla de ventas. ¿Cómo se puede expresar esto en MySQL? Recuerda que hay muchos productos diferentes.

EDITAR: Para hacerlo más difícil, tengo otro requisito. Tengo la mesa comprada, la mesa vendida, pero también tengo la mesa de productos. Quiero una lista de todos los productos, y quiero saber la cantidad disponible de cada producto. El problema con las respuestas actuales es que solo devuelven los productos que ya hemos vendido o comprado. Quiero todos los productos.

¿Fue útil?

Solución

Prueba esto


SELECT inv_t.product_id, inventory_total-nvl(sales_total,0)
FROM 
  (SELECT product_id, sum(quantity) as inventory_total
   FROM inventory
   GROUP BY product_id) inv_t LEFT OUTER JOIN
  (SELECT product_id, count(*) AS sales_total 
   FROM sales 
   GROUP BY product_id) sale_t
  ON (inv_t.product_id = sale_t.product_id)

Esta es una solución mejor que algunas de las otras publicadas, que no tienen en cuenta el hecho de que algunos productos pueden no tener ninguna fila correspondiente en la tabla de ventas. Desea asegurarse de que dichos productos también aparezcan en los resultados.

NVL es una función específica de Oracle que devuelve el valor del primer argumento, a menos que sea nulo, en cuyo caso devuelve el valor del segundo argumento. Hay funciones equivalentes en todos los DBMS comerciales, puede usar CASE en MySQL para el mismo efecto.

Otros consejos

Sugiero hacer el " inventario " y " ventas " Tablas en vistas, para que sean reutilizables y la consulta final se vuelva muy simple. Obviamente, los nombres de los campos y las tablas deberán cambiar para que coincidan con su esquema.

--First view: list products and the purchased qty
create or replace view product_purchases as
select
  product_id
 ,sum(purchased_qty) as purchased_qty
from
  purchases
group by
  product_id;

--Second view: list of products and the amount sold    
create or replace view product_sales as
select
  product_id
 ,count(*) as sales_qty
from
  sales
group by
  product_id;

--after creating those two views, run this query:
select
  pp.product_id
 ,pp.purchased_qty - ps.sales_qty as on_hand_qty
from
  product_purchases pp
 ,product_sales ps
where ps.product_id = pp.product_id;
SELECT product AS prd, 
SUM(quantity) - 
  IFNULL((SELECT COUNT(*)
   FROM sells
   WHERE product = prd 
   GROUP BY product), 0)
AS stock 
FROM bought
GROUP BY product;

Este también funciona cuando la cantidad vendida es 0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top