una - Encontrar la diferencia en el recuento de filas de dos tablas en MySQL
seleccionar varios campos de una tabla en mysql (3)
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 con el mismo efecto.
Tengo dos mesas, una almacena los productos y la cantidad que hemos comprado, la otra almacena las ventas. 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 puede expresarse esto en MySQL? Recuerde 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.
Sugiero hacer las tablas de "inventario" y "ventas" en vistas, para que sean reutilizables y la consulta final sea muy simple. Obviamente, los nombres de campo y tabla deberán cambiar para coincidir 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.