Вычтите два столбца из двух таблиц с помощью Group By - PullRequest
0 голосов
/ 24 сентября 2018

У меня 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

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

enter image description here

StockOut

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 голосов
/ 24 сентября 2018
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

0 голосов
/ 24 сентября 2018
  • Для каждого отдельного результата запроса Select, получите дополнительное поле, а именно, factor .Его значение будет + 1 для складских запасов и -1 для складских запасов.
  • Объедините результаты отдельных запросов на выборку, используя Union All и использовать результирующий набор как Производная таблица .
  • Теперь просто сделайте Sum снова, умножив на коэффициент, для группировки 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
0 голосов
/ 24 сентября 2018

Вы можете использовать объединение двух запросов

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
0 голосов
/ 24 сентября 2018

используйте левое соединение между 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...