用分组依据从两个表中减去两列

时间:2018-09-24 07:17:28

标签: 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);

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

通过使用以下查询,我通过对分支进行分组来从库存表中获得库存和库存。

存货

select BranchId, ifnull(sum(Quantity),0) Quantity from stockin where productid=1 group by BranchId;

enter image description here

缺货

select BranchId, ifnull(sum(Quantity),0) Quantity from stockout where productid=1 group by BranchId;

enter image description here

我想显示这样的结果

enter image description here

4 个答案:

答案 0 :(得分:2)

  • 对于每个单独的Select查询结果,请获取一个附加字段,即 factor 。对于进货,其值为 +1 ,对于缺货,其值为 -1
  • 使用Union All组合单个选择查询的结果,并将结果集用作Derived Table
  • 现在,只需对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

答案 1 :(得分:1)

在stockin和stockout之间使用左连接,这里需要左连接,因为您可能有stockin但可能没有

左加入您的2个需求

select t1.branchId, t1.quantity - coalesce(t2.quantity,0) result
from (
    select BranchId, coalesce(sum(Quantity),0) Quantity 
    from stockin 
    where productid=1 
    group by BranchId
) t1 left join (
   Select BranchId, coalesce(sum(Quantity),0) Quantity 
   from stockout
   where productid=1 
   group by BranchId
) t2 on t1.BranchId = t2.BranchId

branchId    result
1            4
2           10

http://sqlfiddle.com/#!9/c549d3/6

答案 2 :(得分:1)

您可以在两个查询之间使用联接

select a.branchId, a.quantity - ifnull(b.quantity,0) result
from (
    select BranchId, ifnull(sum(Quantity),0) Quantity 
    from stockin 
    where productid=1 
    group by BranchId
) a left join (
   Select BranchId, ifnull(sum(Quantity),0) Quantity 
   from stockout
   where productid=1 
   group by BranchId
) b on a.BranchId = b.BranchId

答案 3 :(得分:0)

select branchid, sum(quantity) total
from
(
select branchid,quantity from stockin
union all
select branchid, quantity*-1 from stockout
) x
group by branchid;

http://sqlfiddle.com/#!9/c549d3/1