求助:DAX计算start_stock/end_stock及库存结转与ID管理问题
期初(Start_Stock)/期末(End_Stock)库存DAX计算方案
核心逻辑
- 期初库存 = 前一日的期末库存(2023-12-31首日直接用初始库存)
- 期末库存 = 期初库存 + 当日入库 - 当日出库
- 自动保留新增ID,剔除当日期末库存为0的旧ID
完整DAX计算表表达式
库存流水表 = VAR 初始库存 = SELECTCOLUMNS( FILTER('原始数据表', '原始数据表'[日期] = DATE(2023,12,31)), "ID", '原始数据表'[ID], "日期", DATE(2023,12,31), "入库", 0, "出库", 0, "End_Stock", '原始数据表'[库存] ) VAR 每日交易数据 = SELECTCOLUMNS( '原始数据表', "ID", '原始数据表'[ID], "日期", '原始数据表'[日期], "入库", '原始数据表'[入库], "出库", '原始数据表'[出库], "End_Stock", BLANK() ) VAR 合并数据集 = UNION(初始库存, 每日交易数据) VAR 排序后数据 = ADDCOLUMNS( SORT(合并数据集, [日期], ASC, [ID], ASC), "前一日期末库存", CALCULATE( MAX([End_Stock]), FILTER( ALL(合并数据集), [日期] < EARLIER([日期]) && [ID] = EARLIER([ID]) ) ) ) VAR 计算期末库存 = ADDCOLUMNS( 排序后数据, "End_Stock_Final", IF( [日期] = DATE(2023,12,31), [End_Stock], COALESCE([前一日期末库存], 0) + [入库] - [出库] ) ) VAR 过滤0库存记录 = FILTER( 计算期末库存, [End_Stock_Final] > 0 || [日期] = DATE(2023,12,31) ) RETURN SELECTCOLUMNS( 过滤0库存记录, "ID", [ID], "日期", [日期], "Start_Stock", IF( [日期] = DATE(2023,12,31), [End_Stock_Final], COALESCE([前一日期末库存], 0) ), "入库", [入库], "出库", [出库], "End_Stock", [End_Stock_Final] )
关键细节解释
- 初始库存整合:把2023-12-31的初始数据单独提取作为首日库存基准,入库出库设为0
- 跨日结转:用
EARLIER匹配当前行的ID和日期,拉取前一日同ID的期末库存,实现自动结转 - 新增ID处理:新ID首次出现时,
COALESCE会把空的前一日库存转为0,再结合当日出入库计算库存 - 剔除0库存旧ID:直接过滤掉当日期末库存为0的记录(首日初始数据除外,避免初始化阶段丢失数据)
使用要求
- 你的
原始数据表必须包含字段:ID、日期、入库、出库,2023-12-31的行需额外有库存字段 - 日期格式要统一为DAX可识别的标准日期类型
- 如果需要配合切片器实时查看,可将计算表改为度量值,核心逻辑保持一致
内容的提问来源于stack exchange,提问作者Tramee
相关产品推荐
相关产品推荐

