在SQL Server FIFO股票清单计价[关闭](FIFO based stock invent

2019-06-23 23:36发布

我有一个股票的交易表所示:

Item   Date         TxnType Qty  Price
ABC   01-April-2012   IN    200 750.00
ABC   05-April-2012   OUT   100     
ABC   10-April-2012   IN     50 700.00
ABC   16-April-2012   IN     75 800.00
ABC   25-April-2012   OUT   175     
XYZ   02-April-2012   IN    150 350.00
XYZ   08-April-2012   OUT   120     
XYZ   12-April-2012   OUT    10     
XYZ   24-April-2012   IN     90 340.00

我需要的库存在FIFO每个项目(先入先出),这意味着第一个购买了物品的价值应该首先被消耗。 上述数据的输出股票估值是:

Item  Qty      Value
ABC   50    40000.00
XYZ   110   37600.00

请帮助我获得解决方案。

Answer 1:

令人惊讶的难以得到的权利。 我怀疑它会使用SQL Server 2012,它支持窗口函数运行总和容易。 无论如何:

declare @Stock table (Item char(3) not null,[Date] datetime not null,TxnType varchar(3) not null,Qty int not null,Price decimal(10,2) null)
insert into @Stock(Item ,  [Date] ,        TxnType, Qty,  Price) values
('ABC','20120401','IN',    200, 750.00),
('ABC','20120405','OUT',   100 ,null  ),
('ABC','20120410','IN',     50, 700.00),
('ABC','20120416','IN',     75, 800.00),
('ABC','20120425','OUT',   175, null  ),
('XYZ','20120402','IN',    150, 350.00),
('XYZ','20120408','OUT',   120 ,null  ),
('XYZ','20120412','OUT',    10 ,null  ),
('XYZ','20120424','IN',     90, 340.00);

;WITH OrderedIn as (
    select *,ROW_NUMBER() OVER (PARTITION BY Item ORDER BY [DATE]) as rn
    from @Stock
    where TxnType = 'IN'
), RunningTotals as (
    select Item,Qty,Price,Qty as Total,0 as PrevTotal,rn from OrderedIn where rn = 1
    union all
    select rt.Item,oi.Qty,oi.Price,rt.Total + oi.Qty,rt.Total,oi.rn
    from
        RunningTotals rt
            inner join
        OrderedIn oi
            on
                rt.Item = oi.Item and
                rt.rn = oi.rn - 1
), TotalOut as (
    select Item,SUM(Qty) as Qty from @Stock where TxnType='OUT' group by Item
)
select
    rt.Item,SUM(CASE WHEN PrevTotal > out.Qty THEN rt.Qty ELSE rt.Total - out.Qty END * Price)
from
    RunningTotals rt
        inner join
    TotalOut out
        on
            rt.Item = out.Item
where
    rt.Total > out.Qty
group by rt.Item

第一个发现是,我们不需要做什么特别的OUT交易-我们只需要知道的总量。 那是什么TotalOut CTE计算。 前两个热膨胀系数与工作IN的交易,并计算什么是“间隔”股票的各自代表-改变最终的查询只select * from RunningTotals到这应该是一个感觉。

最终的SELECT语句查找还没有被传出交易被完全用尽行,然后决定是否它是进入交易的全部数量,还是那就是横跨传出的总交易。



Answer 2:

我认为你必须使用细节事务表这一点。 像股票,StockDetail,StockDetailTransaction。 在这种StockDetailTransaction表包含FIFO入境股票。 当项目进/出了当时StockDetailTransaction添加记录。



文章来源: FIFO based stock inventory valuation in SQL Server [closed]