先进先出(FIFO)是企业管理中广泛应用的库存计价方法,尤其在财务核算和成本分析中扮演着重要角色。本篇文章将介绍如何在PowerBI中按先进先出规则计算商品出库成本。
问题描述
按先进先出规则,计算商品出库成本。例如:对于P002商品,它的总出库数量为11,其中10个用的是1月2日入库的,单价为1,最后1个用的是1月5日入库的,单价为2,因此P002的出库成本即为12。
具体问题如下图所示:
本案例的初始数据如下:
入库:
入库日期 | 商品编码 | 入库数量 | 采购单价 |
---|---|---|---|
2021年1月1日 | P001 | 10 | 1 |
2021年1月4日 | P001 | 5 | 1 |
2021年1月2日 | P002 | 10 | 1 |
2021年1月5日 | P002 | 20 | 2 |
2021年1月3日 | P003 | 10 | 1 |
出库:
出库日期 | 商品编码 | 出库数量 | 销售单价 |
---|---|---|---|
2021年1月1日 | P001 | 5 | 3 |
2021年1月2日 | P002 | 10 | 3 |
2021年1月3日 | P001 | 1 | 3 |
2021年1月6日 | P001 | 1 | 3 |
2021年1月6日 | P002 | 1 | 3 |
若需其它辅助表等,可自行创建并建模。
解题要点
因为DAX中并不支持递归,因此在面对先进先出等场景时,需要找到一种数学上能计算的方法来处理。
假设总出库数量为:100,那么本案例的计算思路如下表所示:
日期 | 入库数量 | 累计入库数量 | 100-累计入库+入库数量 | MAX(MIN(入库数量, 100-累计入库+入库数量), 0) |
---|---|---|---|---|
2025/1/1 | 10 | 10 | 100 | 10 |
2025/1/2 | 30 | 40 | 90 | 30 |
2025/1/3 | 20 | 60 | 60 | 20 |
2025/1/4 | 15 | 75 | 40 | 15 |
2025/1/5 | 26 | 101 | 25 | 25 |
2025/1/6 | 12 | 113 | -1 | 0 |
2025/1/7 | 5 | 118 | -13 | 0 |
2025/1/8 | 10 | 128 | -18 | 0 |
2025/1/9 | 20 | 148 | -28 | 0 |
2025/1/10 | 30 | 178 | -48 | 0 |
解决方案
首先,从入库与出库两个表中提取一个商品维表,并与入库与出库这两个表连接关系,数据模型如下图所示:
然后,创建如下度量值:
出库成本 =
SUMX(
VALUES('商品表'[商品编码]),
CALCULATE(
VAR OutNum = SUM('出库'[出库数量])
VAR EnterTable = '入库'
RETURN
SUMX(
EnterTable,
VAR CurDate = '入库'[入库日期]
VAR CurPrice = '入库'[采购单价]
VAR CurNum = '入库'[入库数量]
VAR CumEnterNum = SUMX(FILTER(EnterTable,'入库'[入库日期]<=CurDate),'入库'[入库数量])
VAR Result = IF(CumEnterNum-CurNum<OutNum,MIN(CurNum,OutNum-CumEnterNum+CurNum))*CurPrice
RETURN
Result
)
)
)
然后创建一个矩阵,并将商品维表中的商品编码字段作为行标签,再将上面的度量值以及出库表的出库数量字段一起放入矩阵的值字段即可,如下图所示:
总结
以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!
PBI/DAX技术交流群(QQ):344353627