2014-10-19 3 views
0

Я хотел бы вычесть одну строку из нескольких строк. Мне нужно, чтобы получить оставшееся количество (дифференцированный по BusTransaction_ID и Artikl, и заказанный X_PDateMonth $ DATE), который является результатом этого вычесть: Result of two queriesСовокупный вычет через несколько строк

и ожидаемые результаты:

 expected results

Результат может быть с или без «нулевых строк». Я не знаю, как добиться этого результата. И будет лучше использовать некоторую «хранимую процедуру» или что-то еще, потому что она будет использоваться для довольно большого набора данных?

Спасибо за все ответы.

+0

В таблице 'subtract', кажется, отсутствуют даты, как вы определяете, что вычитание 1700 должно произойти после даты 41943, а не даты 41935? – jpw

+0

Я должен вычесть ВСЕ строки (из второй таблицы) из первой таблицы (упорядоченной от ближайшего к самому дальнему). Поэтому я считаю, что даты во второй таблице не важны. – Sk1X1

+0

Возможно, я мог бы помочь, но я не понимаю вопроса. Я почти понимаю текст, пока не посмотрю предоставленные данные и результаты. Тогда я совсем не понимаю. –

ответ

1

Вот решение, которое работает, выполнив следующие действия:

  1. Рассчитывает кумулятивные суммы значений в первой таблице.
  2. На основе суммарной суммы определяется значение для вычитания.

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

select t.bustransaction_id, t.artikl, t.xpldate, 
     (case when cumeq <= subt.quantity then 0 
      when cumeq - t.quantity <= subt.quantity 
      then cumeq - subt.quantity 
      else t.quantity 
     end) as newquantity  
from (select t.*, 
      sum(quantity) over (partition by bustransaction_id, artikl order by xpldate) as cumeq 
     from start_table t 
    ) t left join 
    subtract_table subt 
    on t.bustransaction_id = subt.bustransaction_id and 
     t.artikl = subt.artikl 
order by t.bustransaction_id, t.artikl, t.xpldate; 

Here является SQL Скрипки (на основе Brians).

1

Это даст вам результат с «нулевыми строками», используя аналитические функции:

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

Смежные вопросы