【发布时间】:2018-07-30 12:05:47
【问题描述】:
我想知道是否有人至少可以为我指出这个问题的正确方向。
我需要计算平均库存成本,但需要注意的是,它应该只根据我们库存的最新产品采购来计算。
为了更好地解释产品 x,我们以不同的成本从不同的供应商处购买了 1,200 件产品。我们只剩下 150 件库存,因此,要获得剩余商品的平均购买价格和价值,我们需要从最近购买的 150 件仅中获取产品的平均成本。
我有一个产生以下结果的视图:
ProductId (int) - PK
ProductName (varchar(150))
StockInHand (int)
相关表格如下(为方便使用截断)
采购订单
PurchaseOrderId (int) - PK
PurchaseOrderDate (DateTime)
PurchaseOrderStatus (int) - FK
采购订单状态 - 1 = 打开,2 = 已签入
PurchaseOrderLine
PurchaseOrderLineId (int) - PK
Qty (int)
UnitPrice (decimal(18,2))
ProductId (int) - FK
PurchaseOrderId (int) - FK
更新
我在这里创建了一个 sql-fiddle:
http://sqlfiddle.com/#!18/69288/1
你会看到我有三个商品采购订单:
1:数量 20 @ 40 英镑
2:数量 20 @ £30ea
3:数量 10 @ 25 英镑
我有两个相同商品的订单:
1:数量 10
2:数量 15
由此,我可以得到手头的库存:25
我需要剩余股票的平均购买价格。
我还剩 25 件,所以我需要从最新的采购订单开始逆向计算才能获得价值。
我将从采购订单 3 中取出 10 个,从采购订单 2 中取出 15 个:
10 * 25 英镑 = 250 英镑
15 * 30 英镑 = 450 英镑
700 英镑 / 25 = 28 英镑
我希望这能让我的问题更清楚!
谢谢
更新 2
非常感谢 Sticky Bit 抽出时间发布我的问题的解决方案并如此周到地解释它。
我已在我的开发数据库上尝试过此操作,但似乎遇到了问题。
我有 4 个同一产品的采购订单(其中两个是在同一天下的)
我还没有弄清楚如何在这个文本编辑器中优雅地格式化表格,所以请多多包涵:
PurchaseOrderId / PurchaseOrderDate
2 / 2018-07-28
3 / 2018-07-29
4 / 2018-07-30
5 / 2018-07-30
我有以下 PurchaseOrderLine
PurchaseOrderLineId / PurchaseOrderId / ProductId / 数量 / UnitPrice
3 / 2 / 8 / 20 / 400.00
4 / 3 / 8 / 40 / 420.00
5 / 4 / 8 / 25 / 500.00
6 / 5 / 8 / 1 / 200.00
运行以下:
SELECT pol.productid,
po.purchaseorderdate,
sum(pol.qty) qty,
avg(pol.unitprice) unitprice
FROM purchaseorder po
INNER JOIN purchaseorderline pol
ON pol.purchaseorderid = po.purchaseorderid
GROUP BY pol.productid,
po.purchaseorderdate;
给我这些结果:
8 2018-07-28 00:00:00.000 20 400.000000
8 2018-07-29 00:00:00.000 40 420.000000
8 2018-07-30 00:00:00.000 26 350.000000
您会注意到,7 月 30 日购买的产品的平均成本有所下降(它采用两个价格之间的平均值,而不考虑数量 - 我不确定这是否是设计使然?)
如果我然后运行以下命令:
SELECT po.productid,
po.purchaseorderdate,
sum(po.qty) OVER (PARTITION BY po.productid
ORDER BY po.purchaseorderdate) qty,
sum(po.unitprice) OVER (PARTITION BY po.productid
ORDER BY po.purchaseorderdate) unitprice
FROM (SELECT pol.productid,
po.purchaseorderdate,
sum(pol.qty) qty,
avg(pol.unitprice) unitprice
FROM purchaseorder po
INNER JOIN purchaseorderline pol
ON pol.purchaseorderid = po.purchaseorderid
GROUP BY pol.productid,
po.purchaseorderdate) po;
我得到以下结果:
8 2018-07-28 00:00:00.000 20 400.000000
8 2018-07-29 00:00:00.000 60 820.000000
8 2018-07-30 00:00:00.000 86 1170.000000
同样,这里的单价似乎有些不对劲。
非常感谢任何帮助!
亲切的问候
【问题讨论】:
-
示例数据(可能还有sql-fiddle 上的示例模式将有助于为这个问题创建答案,因为目前很难看出问题是什么是实时数量和价格的唯一链接在同一张桌子上
-
嗨 WTP,我创建了一个 sql-fiddle 并相应地更新了我的原始帖子。
-
那么
unitprice是什么?我想这是每件的价格,所以一条线的总价格是unitprice * qty。这个假设是否错误,unitprice是整批的价格,即单个商品的价格是unitprice / qty?最后你想得到什么,每件的平均价格还是这个价格乘以库存商品的数量? -
嗨 Sticky Bit,不,你是对的。单价是每件商品的价格。我需要一件物品的平均成本价,与我们剩余的库存量有关。例如,使用我上面更新的信息,如果我们有 30 件库存商品,平均成本价格将为 466 英镑:(1 x 200 = 200 英镑)+(25 x 500 = 12,500 英镑)+(4 x 420 = £1,280) / 30 如果这有点令人困惑,我深表歉意。再次感谢您
标签: sql sql-server database data-structures views