我有一个股票的交易表所示:
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
请帮助我获得解决方案。
令人惊讶的难以得到的权利。 我怀疑它会使用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
语句查找还没有被传出交易被完全用尽行,然后决定是否它是进入交易的全部数量,还是那就是横跨传出的总交易。
我认为你必须使用细节事务表这一点。 像股票,StockDetail,StockDetailTransaction。 在这种StockDetailTransaction表包含FIFO入境股票。 当项目进/出了当时StockDetailTransaction添加记录。