Это даст вам результат с «нулевыми строками», используя аналитические функции:
select x.*,
case
when subqty >= runner
then 0
when runner > subqty
and lag(runner, 1) over(partition by bustransaction_id, artikl
order by bustransaction_id, artikl, xpldate) > subqty
then quantity
else runner - subqty
end as chk
from (select s.bustransaction_id,
s.artikl,
s.xpldate,
s.quantity,
sum(s.quantity) over( partition by s.bustransaction_id, s.artikl
order by s.bustransaction_id, s.artikl, s.xpldate) as runner,
z.quantity as subqty
from start_table s
join subtract_table z
on s.bustransaction_id = z.bustransaction_id
and s.artikl = z.artikl) x
order by bustransaction_id, artikl, xpldate
Fiddle:http://sqlfiddle.com/#!6/20987/1/0
КОРПУСА заявление в сочетании с функцией LAG является то, что идентифицирует первый " наполовину обедненный "ряд, который является самой большой частью вашего расчета.
В этой скрипке я включил свои производные столбцы, которые были необходимы, чтобы получить то, что вы хотели. Если вы не хотите, чтобы показать те столбцы, которые вы можете просто выбрать те, которые нужны с точки зрения инлайн, как показано здесь: http://sqlfiddle.com/#!6/20987/2/0
В таблице 'subtract', кажется, отсутствуют даты, как вы определяете, что вычитание 1700 должно произойти после даты 41943, а не даты 41935? – jpw
Я должен вычесть ВСЕ строки (из второй таблицы) из первой таблицы (упорядоченной от ближайшего к самому дальнему). Поэтому я считаю, что даты во второй таблице не важны. – Sk1X1
Возможно, я мог бы помочь, но я не понимаю вопроса. Я почти понимаю текст, пока не посмотрю предоставленные данные и результаты. Тогда я совсем не понимаю. –