我有两张桌子,一张存储我们购买的产品和数量,另一张存储销售。因此,当前库存是购买表中所有数量列的总和减去出售表中的行数。这如何在 MySQL 中表达。请记住,有许多不同的产品。
编辑: 为了让它更难,我还有另一个要求。我有购买表,出售表,但我也有产品表。我想要一份所有产品的清单,我想知道每种产品的可用数量。当前答案的问题是他们只退回我们已经出售或购买的产品。我想要所有的产品。
试试这个
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)
这是一个比其他一些解决方案更好的解决方案,这些解决方案没有考虑到某些产品在销售表中可能没有任何对应行的事实。您要确保此类产品也出现在结果中。
NVL 是一个特定于 Oracle 的函数,它返回第一个参数的值,除非它为 null,在这种情况下它返回第二个参数的值。在所有商业 DBMS 中都有等效的功能——您可以在 MySQL 中使用 CASE 来达到相同的效果。
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;
当销售数量为 0 时,此选项也有效。
我建议将“库存”和“销售”表制作成视图,以便它们可重用并且最终查询变得非常简单。显然,字段和表名需要更改以匹配您的架构。
--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;