SQL Вычесть из разных таблиц - PullRequest
1 голос
/ 06 августа 2020

Я вычитаю значения из разных таблиц на основе идентификатора.

Это похоже на инвентарь, где у меня есть таблицы для Itens In и Itens Out.

Я хочу сделать это чтобы вычесть Itens In - Itens Out на основе идентификатора iten.

Мне удается это сделать, но если Iten только как движение In, запрос просто показывает пустую строку, тогда как он должен показывать В движении - момент выхода, который, даже если он не существует, следует рассматривать как 0, показывая в этом случае только значение движения IN.

Может ли кто-нибудь помочь?

Каждая строка в каждой таблице представляет один элемент.

ТАБЛИЦА - in_used

id_item _____ qnt 1 _________500 2 _________ 1000

ТАБЛИЦА - израсходовано

id_item _____ qnt 1 _________ 200

ОЖИДАЕМЫЙ ВЫХОД

used_stock

id_item ____ qnt 1 ________ 300 2 ________1000 (нет движения наружу, поэтому он должен показывать только ВХОД)

Select
    in_used.qnt - out_used.qnt As used_Stock
From
    in_used Inner Join
    out_used On in_used.id_item = out_used.id_item

Ответы [ 4 ]

0 голосов
/ 06 августа 2020

Если id_item уникален в in_used и есть не более 1 строки в out_used, тогда все, что вам нужно, это соединение LEFT и COALESCE():

select i.id_item, 
       i.qnt - coalesce(o.qnt, 0) used_Stock
from in_used i left join out_used o
on i.id_item = o.id_item

Если есть больше строк используют также агрегацию:

select i.id_item, 
       sum(i.qnt) - coalesce(sum(o.qnt), 0) used_Stock
from in_used i left join out_used o
on i.id_item = o.id_item
group by i.id_item
0 голосов
/ 06 августа 2020

Если у вас более одной записи для каждого идентификатора, вы можете использовать sum () и должны использовать FULL JOIN, если в обеих таблицах нет записей, или в противном случае вы можете использовать LEFT JOIN

Select
    id_item , coalesce(sum(in_used.qnt),0) - coalesce(sum(out_used.qnt),0) As used_Stock
From
    in_used FULL Join
    out_used On in_used.id_item = out_used.id_item
GROUP BY id_item 
0 голосов
/ 06 августа 2020

В этом случае мы знаем, что у нас есть id_item во всех случаях для результатов соединения, и ни один из них не будет нулевым:

SELECT I.id_item,
    SUM(I.qnt) - SUM(O.qnt) AS used_Stock
FROM in_used AS I
JOIN out_used AS O ON I.id_item = O.id_item
GROUP BY id_item

Но для общего результата вы можете попробовать следующий запрос:

SELECT (CASE
        WHEN I.id_item IS NOT NULL THEN I.id_item
        ELSE O.id_item
    END) AS id_item,
    SUM(I.qnt) - SUM(O.qnt) AS used_Stock
FROM in_used AS I
JOIN out_used AS O ON I.id_item = O.id_item
GROUP BY id_item

Надеюсь, это сработает для вас!

0 голосов
/ 06 августа 2020

Похоже, вы хотите что-то вроде этого:

select item, sum(inc)
from ((select item, in_used as inc
       from items_in
      ) union all
      (select item, - out_used as inc
       from items_out
      )
     ) ii
group by item;

Я не уверен, что каждая строка в двух таблицах представляет один элемент или есть счетчик. Если есть счетчик, то его следует использовать вместо 1 / -1.

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