0

SQL Server 2008 R2 - необходимо решить FIFO стоимость предметов под рукой. Для этого мне нужно добавить стоимость самого последнего количества квитанций до текущего баланса вручную (OHB).SQL Server - Как решить FIFO Стоимость OHB ... функция, курсор,?

Так позволяет сказать, что у меня есть

Item : b1234 
OHB : 5 

квитанций:

RctNumb | Item | QTYRct | RctCostPerItem | DATERECD 
rct05 | b1234 |  1 |   1.00 | 20160822 
rct04 | b1234 |  3 |   2.00 | 20160820 
rct03 | b1234 |  3 |   1.25 | 20160819 
rct02 | b1234 |  2 |   2.50 | 20160818 
rct01 | b1234 |  8 |   2.00 | 20160810 

Здесь мне нужно: (1 * 1,00) + (3 * 2,00) + (1 * 1,25) = CostofOHB = 8.25

Я понятия не имею, как обратиться к этому с помощью SQL.

+0

Почему нет четырех префикса пространства, сохраняющего мое пространство? – stinkyjak

+0

Поскольку вам нужна ** пустая строка ** между заголовком и следующим абзацем, чтобы получить этот эффект –

+0

Что вам нужно, это общая сумма. С 2012 года это довольно легко и эффективно. С 2008R2 вам нужно сделать более сложный SQL с самонеопределением, что значительно медленнее. –

ответ

0

Я придумал это благодаря подсказкам из других источников. running-totals nested-cursors-w-errors Это очень медленно по сравнению с опцией over (order by) в 2012 году или позже.

DECLARE @FiFo TABLE 
(
RctNumb | Item | QTYRct | RctCostPerItem | DATERECD 
    OHBFIFOCOST  decimal(19,5), 
    OHB  decimal(19,5), 
    SumRctInvcd decimal(19,5), 
    QtyToCost  decimal(19,5), 
    ITEM  nvarchar(65) PRIMARY KEY, 
    ReportDate [datetime2](0) 

); 
declare @ITEM as char(31) 
declare @OHB  as decimal(19,5) 


declare @outer_cursor cursor 
declare @inner_cursor cursor 

declare @RctNumb  nvarchar(32) 
declare @RCTITEM as nvarchar(65) 
declare @QTYRct  decimal(19,5) 
declare @SumRctInvcd decimal(19,5) 
declare @QtyToCost  decimal(19,5) 
declare @RctCostPerItem  decimal(19,5) 
declare @OHBCOST  decimal(19,5) 
declare @OHBrem   decimal(19,5) 
declare @rowIndex  int 
declare @DATERECD  datetime 


declare @fetch_outer_cursor int 
declare @fetch_inner_cursor int 

set @outer_cursor = cursor static local for 

Select 
    ITEM 
    ,OHB 
    from ItemMaster 
    where OHB > 0 

    /*loop through top level cursor*/ 
    open @outer_cursor 
    fetch next from @outer_cursor into @ITEM, @OHB 
    select @fetch_outer_cursor = @@FETCH_STATUS 

    while @fetch_outer_cursor = 0 
    begin 
    /*loop through second level cursor*/ 
     set @inner_cursor = cursor static local for 
     select 
      RctNumb 
      ,QTYRct 
      ,RctCostPerItem 
      ,ITEM 
      ,DATERECD 
      ,rowIndex 
     from RctTbl 
     Where ITEM = @ITEM 
     Order By rowIndex desc 

    open @inner_cursor 
    fetch next from @inner_cursor into @RctNumb, @QTYRct, @RctCostPerItem, @RCTITEM, @DATERECD, @rowIndex 

    set @fetch_inner_cursor = @@FETCH_STATUS 
    while @OHBrem >0 and @fetch_inner_cursor = 0 
    begin 

     set @OHBrem   = @OHBrem - @QTYRct 
     set @QtyToCost  = case 
           When @SumRctInvcd + @QTYRct <= @OHB Then @QTYRct 
           else @OHB - @SumRctInvcd 
          end 
     set @OHBCOST  = case 
           When @SumRctInvcd + @QTYRct <= @OHB Then @OHBCOST + (@QtyToCost * @RctCostPerItem) 
           else @OHBCOST + (@QtyToCost * @RctCostPerItem) 
          end 
     set @SumRctInvcd = @SumRctInvcd + @QtyToCost 

     fetch next from @inner_cursor into @RctNumb, @QTYRct, @RctCostPerItem, @RCTITEM, @DATERECD, @rowIndex 

     set @fetch_inner_cursor = @@FETCH_STATUS 
    end 
    close @inner_cursor 
    deallocate @inner_cursor 
     INSERT @FiFo(OHBFIFOCOST, OHB, ITEM, ReportDate, QtyToCost, SumRctInvcd) 
     SELECT @OHBCOST, @OHB, @ITEM, GETDATE(), @QtyToCost, @SumRctInvcd; 

    fetch next from @outer_cursor into @ITEM, @OHB 
    set @fetch_outer_cursor = @@FETCH_STATUS 


    end 

    close @outer_cursor 
    deallocate @outer_cursor 
    select * from @FiFo 
+0

@P. Коваракис благодарит за намек. – stinkyjak

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

  • Нет связанных вопросов^_^