使用 Group By 从两个表中减去两列

Ros*_*han 5 mysql sql database

我有4张桌子。

CREATE TABLE Branch(
  ID INT,
  Name VARCHAR(50)
);

INSERT INTO Branch VALUES 
(1,'A'), (2,'B');

CREATE TABLE Product(
  ID INT,
  Name VARCHAR(50)
);

INSERT INTO Product VALUES 
(1,'X'), (2,'Y');

CREATE TABLE StockIn(
  ID INT,
  ProductId INT,
  Quantity INT,
  BranchId INT
);

INSERT INTO StockIn VALUES 
(1,1,10,1),
(2,1,20,1),
(3,1,50,2),
(4,1,10,2);

CREATE TABLE StockOut(
  ID INT,
  ProductId INT,
  Quantity INT,
  BranchId INT
);

INSERT INTO StockOut VALUES 
(1,1,5,1),
(2,1,21,1),
(3,1,45,2),
(4,1,5,2);
Run Code Online (Sandbox Code Playgroud)

现在我想根据这些计算库存(StockIn-StockOut)。

通过使用下面的查询,我通过对分支进行分组,从库存表中获取了库存和库存。

库存

select BranchId, ifnull(sum(Quantity),0) Quantity from stockin where productid=1 group by BranchId;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

脱销

select BranchId, ifnull(sum(Quantity),0) Quantity from stockout where productid=1 group by BranchId;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想展示这样的结果

在此输入图像描述

Mad*_*iya 4

  • 对于每个单独的 Select 查询结果,获取一个附加字段,即Factor。有货时其值为+1,缺货时值为-1
  • 使用Union All组合各个选择查询的结果,并将结果集用作派生表
  • 现在,只需对 BranchId 分组再次执行 Sum,乘以因子即可。

尝试以下查询:

SELECT derived_t.BranchId, 
       SUM(derived_t.factor * derived_t.quantity) AS Quantity 
FROM 
(
 select BranchId, 
        ifnull(sum(Quantity),0) as quantity, 
        1 as factor 
 from stockin 
 where productid=1 
 group by BranchId

 UNION ALL 

 select BranchId, 
        ifnull(sum(Quantity),0) Quantity, 
        -1 as factor
 from stockout 
 where productid=1 
 group by BranchId
) AS derived_t 

GROUP BY derived_t.BranchId
Run Code Online (Sandbox Code Playgroud)