如何基于生产/交付日期及库存自动分配订单批次?寻求技术方案
批次分配自动化实现方案(DAX/Power Query/Excel公式)
可以实现,以下分三种方案说明,适配不同业务场景:
Power Query(首推方案,适合批量自动化)
针对每周导入CSV订单的场景,Power Query的批量数据转换能力最适配,核心逻辑是通过分组排序+累计值匹配实现批次分配:
- 预处理表B:按
Item code分组,每组内按生产日期升序(旧批次优先)排序,计算批次累计库存; - 预处理表A:按
Item code分组,每组内按订单号/交付日期升序(旧订单优先)排序,计算订单累计需求; - 批次匹配:对每个
Item code组,将累计需求与累计库存做区间匹配,自动分配对应批次(含跨批次分配场景); - 合并回写:将分配结果合并到原表A,填充
Batch no.列。
关键M代码片段(表B预处理):
let Source = Excel.CurrentWorkbook(){[Name="表B"]}[Content], 按Item分组 = Table.Group(Source, {"Item code"}, {{"批次明细", each Table.Sort(_,{{"生产日期", Order.Ascending}}), type table}}), 添加累计库存 = Table.TransformColumns(按Item分组, {{"批次明细", each Table.AddColumn(_, "累计库存", (x) => List.Sum(List.Range([可用库存],0,Table.PositionOf(_,x)+1)))}}) in 添加累计库存
完成配置后,每周只需导入新的CSV订单,点击刷新即可自动完成批次分配。
DAX(适合Power BI动态分析场景)
如果是在Power BI中做动态库存分配分析,可通过DAX计算列/度量值实现:
- 先在表B中计算按
Item code+生产日期排序的累计库存列; - 对表A的每一行,计算当前
Item code下的累计需求(当前订单及之前的总需求); - 通过区间匹配找到覆盖累计需求的批次,跨批次场景用
CONCATENATEX合并批次号。
示例DAX计算列:
Batch no. = VAR CurrentItem = '表A'[Item code] VAR CurrentDemand = '表A'[需求数量] VAR CumulativeDemand = CALCULATE( SUM('表A'[需求数量]), ALLEXCEPT('表A', '表A'[Item code]), '表A'[订单号] <= EARLIER('表A'[订单号]) ) VAR PreviousCumulativeDemand = CumulativeDemand - CurrentDemand VAR TargetBatches = FILTER( '表B', '表B'[Item code] = CurrentItem && '表B'[累计库存] > PreviousCumulativeDemand && '表B'[累计库存] <= CumulativeDemand ) // 处理跨多个批次的情况 VAR CrossBatches = IF(COUNTROWS(TargetBatches)=0, FILTER('表B', '表B'[Item code]=CurrentItem && '表B'[累计库存]>PreviousCumulativeDemand), TargetBatches) RETURN CONCATENATEX(CrossBatches, '表B'[Batch no.], ", ")
Excel公式(适合小数据量场景)
数据量较小时,可通过Excel函数组合快速实现,需提前对表B按Item code+生产日期排序并计算累计库存:
- 用
SUMIF计算表A中当前Item code的累计需求; - 用
FILTER筛选出覆盖累计需求区间的批次; - 用
TEXTJOIN合并跨批次的结果。
示例公式(假设表B累计库存列在E列,表AItem code在F列,需求数量在H列):
=TEXTJOIN(", ", TRUE, FILTER($D$2:$D$100, $B$2:$B$100=F2 && $E$2:$E$100>=(SUMIF($F$2:F2, F2, $H$2:H2)-H2) && $E$2:$E$100<=SUMIF($F$2:F2, F2, $H$2:H2) ) )
内容的提问来源于stack exchange,提问作者Michael Molnár
相关产品推荐
相关产品推荐

