Кумулятивный Акционерный Холдинг - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать запас на основе следующих данных.

Ввод и требуемый вывод Я пытался создать столбец транзакций (Starting + UK Open PO - UK Sales ).

Затем использовал приведенный ниже код SQL для создания пакета акций.

Sum OVER (   TRANSACTIONS)
   [ <PARTITION BY No_ ]  
   [ <ORDER BY Date ]   

Но проблема в том, что я не хочу, чтобы пакет акций в go стал отрицательным , Я хочу, чтобы он показывал 0, поэтому, когда 14/04/19 поступит 960 единиц, запас будет 921 единиц (960-39) вместо 116 единиц.

Желаемым выводом является столбец, выделенный желтым цветом. , Мне нужно более 5k SKU (столбец № _)

Любая помощь будет принята с благодарностью.

    No_ Date    UK-Open PO  UK-Sales    Starting Stock  Trans.  Cumul Stock     Stock Level
111111  22/03/2019                47            100       53             53         53
111111  24/03/2019               330                     -330           -277        0
111111  31/03/2019               443                     -443           -720        0
111111  07/04/2019               85                      -85            -805        0
111111  14/04/2019  960          39                       921            116        921
111111  21/04/2019  960          112                      848            964        1769
111111  28/04/2019               100                     -100            864        1669
111111  05/05/2019               504                     -504            360        1165
111111  12/05/2019               606                     -606           -246        559
111111  19/05/2019               118                     -118           -364        441
111111  26/05/2019               400                     -400           -764        41
111111  02/06/2019               674                     -674          -1438        0
111111  09/06/2019               338                     -338          -1776        0
111111  16/06/2019               206                     -206          -1982        0
111111  23/06/2019               115                     -115          -2097        0
111111  30/06/2019  500          66                       434          -1663        434
111111  07/07/2019               33                       -33          -1696        401

1 Ответ

1 голос
/ 25 марта 2020

Подавление отрицательных чисел в процессе работы требует запоминания того, что произошло во всех предыдущих строках. Увы, этого нельзя сделать с помощью оконной функции.

Альтернативой является рекурсивный CTE:

with t as (
      select no_, date, starting_stock, trans,
             row_number() over (partition by no_ order by date) as seqnum
      from <table>
     ),
     cte as (
      select no_, date, trans, seqnum,
             starting_stock as stock_level
      from t
      where seqnum = 1
      union all
      select t.no_, t.date, t.trans, t.seqnum,
             (case when cte.starting_stock + t.trans < 0 then 0
                   else cte.starting_stock + t.trans
              end) as stock_level
      from cte join
           t
           on t.seqnum = cte.seqnum + 1 and
              t.no_ = cte.no_
     )
select *
from cte
option (maxrecursion 0);

option нужен только в том случае, если число строк превышает 100 из рекурсии.

...