您需要在购买表中添加一个 QtySold 列,并在每次销售时遍历以下算法:
qty_left = sale_qty
tot_cost = 0;
while qty_left > 0
fetch oldest row where qty_sold < qty
if qty_left + qty_sold < qty
then
set qty_sold = qty_sold + qty_left
tot_cost = tot_cost + (Purchase.Cost * qty_left)
qty_left = 0
else
qty_at_this_cost = qty - qty_sold
set qty_sold = qty
tot_cost = tot_cost + (Purchase.cost * qty_at_this_cost)
qty_left = qty_left - qty_at_this_cost
avg_cost = tot_cost / sale_qty
虽然可以使用递归 SQL 来做到这一点,但它既不高效也不可读。
您可能会说服您的用户使用更明智、更容易计算移动平均成本的方法。
即每次购买新股票时,您都会计算 MVC = ((Current Stock * MVC) + (New Stock * New Cost)) / (Current Stock + New Stock)
这是相似的,但它平均了所有购买的成本。