繁体   English   中英

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

[英]Subtract two columns from two tables with Group By

我有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)计算股票。

通过使用下面的查询我通过分组他们的分支从库存表获得stockin和stockout。

StockIn

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

在此输入图像描述

脱销

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

在此输入图像描述

我想像这样显示结果

在此输入图像描述

  • 对于每个单独的Select查询结果,获取一个附加字段,即factor 其库存值为+1 ,库存为-1
  • 使用Union All组合各个选择查询的结果,并将结果集用作派生表
  • 现在,在BranchId的分组上再简单地再次使用因子。

请尝试以下查询:

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

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

离开加入你的2个quires

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

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

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
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM