Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中查找两个表的行数差异_Mysql_Sql_Count_Sum - Fatal编程技术网

在MySQL中查找两个表的行数差异

在MySQL中查找两个表的行数差异,mysql,sql,count,sum,Mysql,Sql,Count,Sum,我有两张桌子,一张存储我们购买的产品和数量,另一张存储我们销售的产品和数量。因此,当前库存是购买表中所有数量列的总和减去销售表中的行数。如何在MySQL中表达这一点。记住,有很多不同的产品 编辑: 更难的是,我还有一个要求。我有买的表,卖的表,但我也有产品表。我想要一份所有产品的清单,我想知道每种产品的可用数量。当前答案的问题是,他们只退回我们已经售出或购买的产品。我想要所有的产品。试试这个 SELECT inv_t.product_id, inventory_total-nvl(sales_

我有两张桌子,一张存储我们购买的产品和数量,另一张存储我们销售的产品和数量。因此,当前库存是购买表中所有数量列的总和减去销售表中的行数。如何在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)

这是一个比其他一些发布的解决方案更好的解决方案,这些解决方案没有考虑到某些产品在sales表中可能没有任何对应的行这一事实。您希望确保这些产品也显示在结果中

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;

我想你指的是第一线的库存产品。谢谢你的帮助,修好了。它确实显示了一个尚未销售的产品,这就是为什么它是一个外部连接。我添加了一个nvl()调用,以明确这是应该发生的事情