Encontrar la diferencia en el recuento de filas de dos tablas en MySQL
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.
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.