我有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;
缺货
select BranchId, ifnull(sum(Quantity),0) Quantity from stockout where productid=1 group by BranchId;
我想显示这样的结果
答案 0 :(得分:2)
尝试以下查询:
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
答案 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;