基于DAX计算仓库事实表特定时间点的在途订单量问题
仓库交易度量解决方案:入库量、出库量与在途订单量
我来帮你搞定这三个度量的实现,尤其是那个难搞的In Order(在途订单量),先理清楚数据逻辑和需求,再一步步写DAX:
一、简单度量:入库量与出库量
这部分没什么难度,直接用SUM聚合对应字段就行:
- 入库量度量:
入库量 := SUM(Transactions[qIn])
- 出库量度量:
出库量 := SUM(Transactions[qOut])
二、核心难点:In Order(在途订单量)
需求拆解
在途量的本质是:截止到当前统计月份的月末,已经下单(OrderDate ≤ 当月月末)但还未入库(TransactionDate > 当月月末)的商品数量。
我给你两种实现思路,一种是直接逻辑计算,另一种对应你提到的间接思路:
思路1:直接计算法(逻辑更清晰)
这个方法需要依赖一张日期表(Date Table),并且要让Transactions表的TransactionDate和OrderDate都与日期表建立关系,这样透视表按月份筛选时才能准确计算对应月末的在途量。
DAX代码:
In Order(在途量):= VAR 当前月末 = EOMONTH(MAX('日期表'[Date]), 0) -- 获取透视表当前行对应的月末日期 VAR 总下单量 = CALCULATE( SUM(Transactions[qIn]), Transactions[OrderDate] <= 当前月末 ) VAR 总入库量 = CALCULATE( SUM(Transactions[qIn]), Transactions[TransactionDate] <= 当前月末 ) RETURN 总下单量 - 总入库量
为什么这么写?因为总下单量是到当月月末为止所有已经下单的商品数,减去到当月月末已经入库的数量,剩下的就是还没入库的在途量,完全贴合需求逻辑。
思路2:间接计算法(对应你提到的思路)
如果你想用“总订单量 - 当月入库的往期订单量”的逻辑来实现,也可以这样写:
首先定义两个辅助度量,再组合成最终的在途量:
-- 辅助度量1:总订单量(截止到当月月末的所有qIn订单量) 总订单量 := VAR 当前月末 = EOMONTH(MAX('日期表'[Date]), 0) RETURN CALCULATE( SUM(Transactions[qIn]), Transactions[OrderDate] <= 当前月末 ) -- 辅助度量2:当月入库的往期订单量(下单月份≠当前月份,但当月完成入库的qIn) 当月入库的往期订单量 := VAR 当前月份 = MONTH(MAX('日期表'[Date])) VAR 当前年份 = YEAR(MAX('日期表'[Date])) RETURN CALCULATE( SUM(Transactions[qIn]), (MONTH(Transactions[OrderDate]) <> 当前月份 || YEAR(Transactions[OrderDate]) <> 当前年份), Transactions[TransactionDate] <= EOMONTH(MAX('日期表'[Date]), 0) ) -- 最终在途量度量 In Order(间接法):= [总订单量] - [当月入库的往期订单量]
示例验证(用你的测试数据)
拿你给的测试数据来看:
| ID | Item | TransactionDate | OrderDate | qIn | qOut |
|---|---|---|---|---|---|
| 1 | A | 2019-01-30 | 2019-01-10 | 5 | 0 |
| 2 | A | 2019-02-20 | 2019-01-15 | 3 | 0 |
| 3 | A | 2019-03-12 | 2019-01-20 | 0 | 6 |
| 4 | A | 2019-03-30 | 2019-02-20 | 20 | 0 |
计算2019年1月末的在途量:
- 总下单量:OrderDate ≤ 2019-01-31的qIn总和 = 5+3 = 8
- 总入库量:TransactionDate ≤ 2019-01-31的qIn总和 = 5
- 最终在途量:8-5 = 3,和你描述的“1月末未入库的3件A在途”完全一致。
如果是完整数据下1月末在途量为29,这个公式也能准确计算出对应结果。
三、透视表使用提示
把日期表的月份字段拖到透视表的行区域,然后把三个度量拖到值区域,就能得到每个月对应的入库量、出库量和在途量了。
内容的提问来源于stack exchange,提问作者spiderman
相关产品推荐
相关产品推荐

