I have 4 tables.
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);
Now i want to calculate stock from these (StockIn-StockOut).
by using below query i got stockin and stockout from stock tables by grouping thier branches.
StockIn
select BranchId, ifnull(sum(Quantity),0) Quantity from stockin where productid=1 group by BranchId;

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

and i want to show the result like this

Basic Syntax:SELECT column1 , column2 , ... columnN FROM table_name WHERE condition MINUS SELECT column1 , column2 , ... columnN FROM table_name WHERE condition; columnN: column1, column2.. are the name of columns of the table.
Yes, it is possible to use MySQL GROUP BY clause with multiple columns just as we can use MySQL DISTINCT clause.
Unfortunately, groupby function does not allow you to use multiple table columns, you can only use one table which defined in the function table parameter.
Try the following query:
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
                        You could use a join between the two query
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
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With