Использование упрощенной версии ваших данных ...
select * from stock;
job_no qty location
---------- ---------- ----------
123 0 loc1
123 0 loc2
123 10 loc3
123 0 loc4
456 0 loc1
456 20 loc2
Вы можете использовать дополнительный выбор, чтобы получить количество для каждой работы, и присоединиться к нему, чтобы получить запас для каждой работы.
select stock.*, stocked.qty
from stock
join (select * from stock s where s.qty != 0) as stocked
on stock.job_no = stocked.job_no;
job_no qty location qty
---------- ---------- ---------- ----------
123 0 loc1 10
123 0 loc2 10
123 0 loc4 10
123 10 loc3 10
456 0 loc1 20
456 20 loc2 20
stocked
содержит строку для каждой работы, которая в данный момент хранится в хранилище.
Обратите внимание, что, если вы не установили ограничение, для работы может быть несколько строк для заготовки.
loc7 необходимо будет применить расчет ко всем расположенным перед ним местоположениям (кол-во 20).
С этими данными...
sqlite> select * from stock order by job_no, location;
job_no qty location
---------- ---------- ----------
123 0 loc1
123 0 loc2
123 10 loc3
123 0 loc4
123 0 loc5
123 0 loc6
123 20 loc7
456 0 loc1
456 20 loc2
Чтобы выполнить это, вместо присоединения к подвыборке, сделайте это для каждого столбца, в противном случае мы получим несколько значений на складе.(Возможно, есть способ сделать это с помощью объединения)
Чтобы убедиться, что мы выбираем только предыдущие местоположения (или наши собственные), необходимо проверить, что stock.location <= stocked.location
.Чтобы гарантировать, что мы получим самый близкий, упорядочите их по местоположению и выберите только первый.
select stock.*, (
select stocked.qty
from stock stocked
where stock.job_no = stocked.job_no
and qty != 0
and stock.location <= stocked.location
order by stocked.location asc
limit 1
) as stocked_qty
from stock
order by job_no, location;
job_no qty location stocked_qty
---------- ---------- ---------- -----------
123 0 loc1 10
123 0 loc2 10
123 10 loc3 10
123 0 loc4 20
123 0 loc5 20
123 0 loc6 20
123 20 loc7 20
456 0 loc1 20
456 20 loc2 20
Это может быть неэффективно в качестве подвыбора столбца.Важно, чтобы все job_no, qty и location были проиндексированы.