我正在使用sql server 2008。
我是用先进先出的方法来计算的,就像理货一样。
我有视图,其中有多个表输出,因此创建示例表格如下
create table #StockView
(
StoreId int,
ProductId int,
TranDate Date,
TransectionType varchar(5),
Quantity numeric(18,3),
UnitCost numeric(18,2)
)
insert into #StockView select 1 , 512 , '2013-03-30 ' , 'IN' , 1870, 35.57
insert into #StockView select 1 , 512 , '2013-04-05 ' , 'OUT' , 500 , 0
insert into #StockView select 1 , 512 , '2013-04-05 ' , 'OUT' , 150 , 0
insert into #StockView select 1 , 512 , '2013-04-15 ' , 'OUT' , 15 , 0
insert into #StockView select 1 , 512 , '2013-04-23 ' , 'OUT' , 125 , 0
insert into #StockView select 1 , 512 , '2013-04-25 ' , 'OUT' , 40 , 0
insert into #StockView select 1 , 512 , '2013-04-26 ' , 'OUT' , 734 , 0
insert into #StockView select 1 , 512 , '2013-05-15 ' , 'IN' , 1520, 35
insert into #StockView select 1 , 512 , '2013-05-15 ' , 'IN' , 1520, 35
insert into #StockView select 1 , 512 , '2013-05-23 ' , 'OUT' , 40 , 0
insert into #StockView select 1 , 512 , '2013-06-05 ' , 'OUT' , 70 , 0
insert into #StockView select 1 , 512 , '2013-06-06 ' , 'OUT' , 50 , 0
insert into #StockView select 1 , 512 , '2013-06-07 ' , 'OUT' , 286 , 0
insert into #StockView select 1 , 512 , '2013-06-10 ' , 'OUT' , 50 , 0
insert into #StockView select 1 , 512 , '2013-06-11 ' , 'OUT' , 41 , 0
insert into #StockView select 1 , 512 , '2013-06-15 ' , 'OUT' , 150 , 0
insert into #StockView select 1 , 512 , '2013-06-17 ' , 'OUT' , 700 , 0
insert into #StockView select 1 , 512 , '2013-06-21 ' , 'OUT' , 433 , 0
insert into #StockView select 1 , 512 , '2013-06-25 ' , 'OUT' , 20 , 0
insert into #StockView select 1 , 512 , '2013-06-26 ' , 'OUT' , 25 , 0
select * from #StockView
StoreId ProductId TranDate TransectionType Quantity UnitCost
1 512 2013-03-30 IN 1870.000 35.57
1 512 2013-04-05 OUT 500.000 0.00
1 512 2013-04-05 OUT 150.000 0.00
1 512 2013-04-15 OUT 15.000 0.00
1 512 2013-04-23 OUT 125.000 0.00
1 512 2013-04-25 OUT 40.000 0.00
1 512 2013-04-26 OUT 734.000 0.00
1 512 2013-05-15 IN 1520.000 35.00
1 512 2013-05-15 IN 1520.000 35.00
1 512 2013-05-23 OUT 40.000 0.00
1 512 2013-06-05 OUT 70.000 0.00
1 512 2013-06-06 OUT 50.000 0.00
1 512 2013-06-07 OUT 286.000 0.00
1 512 2013-06-10 OUT 50.000 0.00
1 512 2013-06-11 OUT 41.000 0.00
1 512 2013-06-15 OUT 150.000 0.00
1 512 2013-06-17 OUT 700.000 0.00
1 512 2013-06-21 OUT 433.000 0.00
1 512 2013-06-25 OUT 20.000 0.00
1 512 2013-06-26 OUT 25.000 0.00
请通过https://www.simple-talk.com/sql/performance/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/或calculate closing Stock Quantity,price & value by FIFO
上面的链接给出了可用库存或期末库存及其价值,但我正在寻找商店过程或函数,这些函数接受商店代码,产品ID,fromDate和结束日期,预期输出是基于以上数据的
打开:数据应该在起始日期之前,即给定1例如@fromDate < 2013-04-01。向内:两个周期之间的总产量,即总和(数量)向外:简而言之,在两个周期之间,我需要两个周期之间所有产品的月度库存。
请帮帮我,我想要这份报告已经超过6个月了
现在我几乎完成了,只是我在外向率上遇到了问题。如果我根据FIFO获得外向率,那么我的问题就解决了。我已经写了存储过程,它返回期初数量,费率和价值。通过此链接https://www.simple-talk.com/sql/performance/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/。除了outwardRate之外,其他的都很容易计算。
inwardQty =sum(数量) where transectionType = 'IN‘,@startDate和@EndDate之间的TransDate
inwardRate = sum(inwardQty * UnitCost)/ Sum(inwardQty)
inwardValue = sum(inwardQty) * (sum(inwardQty * UnitCost)/ Sum(inwardQty) )
outwardQty =sum(数量) where transectionType = 'Out‘,@startDate和@EndDate之间的TransDate
outWardRate = ??--在这里我遇到了问题,如何获得outwardRate编码的先进先出方法
OutwardValue= outwardQty *outWardRate
ClosingQty =( opningQty + inwardQty )- outwardQty
ClosingRate = ((OpningValue + InwardValue) - OutwardValue) / (( opningQty + inwardQty )- outwardQty)
ClosingValue = (OpningValue + InwardValue) - OutwardValue
发布于 2014-12-27 22:16:44
进入库存控制先进先出( FIFO )(或后进先出( LIFO )或任何使用的方法)从来都不像你想象的那么容易,无论提供了哪些下行链接。
您引用您感兴趣的日期,例如一个范围,但是期初库存必须基于这些值来计算,并且您必须确定在正确反映库存值的同时,期初“价格”是多少。请考虑以下内容。
Jan 1 Begin 20 @ 14.59
Feb 1 Buy 10 @ 17.28
Feb 3 Sell 18 @ 22.79 (selling price)
Mar 1 Buy 25 @ 18.34
Mar 3 Sell 9 @ 24.00
Apr 1 Buy 15 @ 16.95
Apr 3 Sell 12 @ 24.00
May 1 Buy 10 @ 16.24
因此,您要求提供上述库存项目的3月1日至6月1日的报告。期初库存是12 (期初库存加上3月1日之前的任何购买减去销售)。然而,您在2月1日的最后一次购买是10,但还剩下12。那么,您决定使用什么作为价格值。最近的2月1日是哪一天?或者是1月1日的期初余额,它是基于最多的。做出决定并坚持下去。现在,来看看商品的价值。对于快速报告,您只需选择Qty On Hand * Value即可。然而,从总账的真实会计报告角度来看,您的价值是基于购买某物时的实际价值。因此,在1月1日的期初库存日期14.59的剩余数量为2,而2月1@ 17.28的剩余数量为10。
早在1987年,我就使用过各种会计系统,我发现也应用了类似的方法,但我会表达我个人对暴露在其中的方法的偏好,因为看起来你正在寻找一个系统的答案,你无论如何都是试图基于别人的工作来构建一个系统。这是表的简化版本
项目(通用库存项目,总体描述,大小,制造,其他标准) ItemActivity (处理每个项目/商店的采购,销售,退货,库存调整) ItemSerials (如果这些项目被序列化,则为itemActivity条目的子级,以便在出售和从库存中取出时可以明确地从库存计数中删除)
现在,在ItemActivity中-同样,缩写(除了QtyAvail之外非常类似于你所拥有的)
ID, StoreID, ItemID, TransType, ActivityDate, Qty, Price, QtyAvail
这里的关键部分是QtyAvail,它只基于一件商品的购买数量。当商品售出时,系统应转到商店/商品和(先进先出)的行,第一个可用于QtyAvail >0的购买条目,并开始从每一行应用这些条目,直到计数全部用完。如果最近一次销售的数量超过了QtyAvail的数量,您需要减少一个条目的计数,然后在列表中查找下一个QtyAvail,直到所有已售出的数量都被计算在内。
因此,就像期初余额的示例场景一样,期初余额可能跨越2个(或更多)未触及的采购库存计数,从而形成期初余额,您可以在给定的日期/时间具有类似的多个未售出的商品。所以那也..。价格和价值与账面价值相比是什么?
对于仓库经理的快速查看,他们可能想要多少和最新价格,太好了。然而,真正的会计计帐员想要的是基于公司各自收购价格的真实价值,它们是完全不同的数字……同样适用于商品销售成本的计算。经理只关心你是否以Y的价格卖出了X个。会计人员必须走额外的水平,多少X在基于先进先出的采购价格进入它花费了公司。
库存是一头需要处理的大野兽,你肯定需要在未来处理它的下降处理,而不仅仅是为了获得报告的快速答案解决方案。
https://stackoverflow.com/questions/27662361
复制相似问题