2008-10-28 35 views
5

我有两张表,一个存储我们购买的产品和数量,另一个存储销售量。因此当前库存是买入表中所有数量列的总和减去销售表中的行数。这怎么能在MySQL中表达。请记住,有很多不同的产品。查找MySQL中两个表的行数差异

编辑: 为了让它更难,我有另一个要求。我有买桌子,卖桌子,但我也有产品桌子。我想要一份所有产品的清单,并且我想知道每种产品的可用数量。目前的答案是,他们只返回我们已经出售或购买的产品。我想要所有的产品。

+0

总和http://stackoverflow.com/questions/826365/how-do-i-add-two-count-results-together-on-two-different-tables – 2016-05-20 21:01:52

回答

6

试试这个


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的函数,它返回第一个参数的值,除非它为空,在这种情况下,它将返回第二个参数的值。在所有商业DBMS中都有相同的功能 - 你可以在MySQL中使用CASE来达到同样的效果。

+0

我认为你的意思inv_t.product在第一行。 – Marius 2008-10-28 12:59:10

0
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

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;