web-dev-qa-db-ja.com

SQLServer-解決方法FIFO OHBのコスト...関数、カーソル、?

SQL Server 2008R2-FIFO手持ちのアイテムのコストを解決する必要があります。これを行うには、現在の手持ちの残高(OHB)までの最新のレシート数量のコストを追加する必要があります。

だから私がアイテムを持っているとしましょう:b1234 OHB:5

Receipts:
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でこれに対処する方法がわかりません。

1
stinkyjak

Kathi Kellenbergerは、2010年のRedgateのFIFO原価計算を比較しました。私は、入賞方法を使用して、メキシコ事業の月間在庫数量と値を計算しました。これがあれば、Set based speedPHreakeryを検索できます。リンクが機能しません。 https://www.red-gate.com/simple-talk/sql/performance/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/

2
JoeDBA_HAHAHA

私は他の情報源からのヒントのおかげでこれを思いついた。

実行中の合計

nested-cursors-w-errors

2012年以降のover(order by)オプションに比べて非常に遅いです。

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
stinkyjak

次の方法でグループを使用できます。

    select item, sum(qtyrct * rctcostperitem) as costOHB
    group by item
0
James