求正确DAX公式:计算Projected Workable列累计值
Power BI 每日预计工作量计算DAX公式解决方案
问题背景
需在Power BI中制作每日预计工作量图表,以Projected Workable为Y轴、日期为X轴。现有数据表包含以下列:
Current Workable:当日可用工作量Recovery:当日送达工厂的在途工作量Pack Commit:当日工厂产能Projected Workable:待计算的预计工作量列Index:从0开始的序列索引
当前DAX公式无法正确引用同列上一行的值,导致计算结果错误(例如Index=1的正确值应为14447+20294-6000=28741,但当前结果不符)。
计算规则
- Index=0时:
Projected Workable = Current Workable + Recovery - Index≥1时:
Projected Workable(当前Index) = Projected Workable(上一Index) + Recovery(当前Index) - Pack Commit(上一Index) - 额外规则:
- 若上一日的
Projected Workable小于产能6000,实际消耗的Pack Commit取上一日的Projected Workable值(即仅能处理现有工作量) - 周末(周六、周日)及休息日不工作,对应
Projected Workable为0
- 若上一日的
样本数据
| Index | Date | Day of Week Name | Current Workable | Pack Commit | Recovery | Projected Workable(错误结果) |
|---|---|---|---|---|---|---|
| 0 | 4/9/2024 | Tuesday | 14194 | 6000 | 253 | 14447 |
| 1 | 4/10/2024 | Wednesday | 0 | 6000 | 20294 | 14294 |
| 2 | 4/11/2024 | Thursday | 0 | 6000 | 1324 | -4676 |
| 3 | 4/12/2024 | Friday | 0 | 6000 | 1627 | -4373 |
| 4 | 4/13/2024 | Saturday | 0 | 0 | 0 | 0 |
| 5 | 4/14/2024 | Sunday | 0 | 0 | 0 | 0 |
错误公式分析
原公式未实现同列上一行值的引用逻辑,也未处理“Projected Workable小于6000时调整Pack Commit”及休息日递推规则:
Projected Workable = IF('Workable'[Index] = 0,'Workable'[Current Workable]+'Workable'[Recovery],('Workable'[Current Workable]-IF(('Workable'[Day of Week Name]="Saturday")||('Workable'[Day of Week Name]="Sunday")||('Workable'[Date] = 'Workable'[Off Days]),0,'Workable'[Pack Commit])+'Workable'[Recovery]))
正确DAX公式
Projected Workable = VAR CurrentIndex = 'Workable'[Index] VAR IsWorkDay = NOT('Workable'[Day of Week Name] IN {"Saturday", "Sunday"}) -- 若有单独的休息日列,可修改为:NOT('Workable'[Day of Week Name] IN {"Saturday", "Sunday"}) && NOT('Workable'[Date] IN VALUES('Workable'[Off Days])) VAR PreviousIndex = CurrentIndex - 1 VAR PreviousProjected = CALCULATE( SELECTEDVALUE('Workable'[Projected Workable]), FILTER( ALL('Workable'), 'Workable'[Index] = PreviousIndex ) ) VAR PreviousPackCommit = CALCULATE( SELECTEDVALUE('Workable'[Pack Commit]), FILTER( ALL('Workable'), 'Workable'[Index] = PreviousIndex ) ) -- 处理额外规则:上一日实际消耗取现有工作量或产能的较小值 VAR ActualPreviousConsumption = IF( PreviousProjected < 6000, PreviousProjected, PreviousPackCommit ) RETURN IF( CurrentIndex = 0, 'Workable'[Current Workable] + 'Workable'[Recovery], IF( NOT(IsWorkDay), 0, PreviousProjected + 'Workable'[Recovery] - IF(PreviousIndex >= 0, ActualPreviousConsumption, 0) ) )
公式说明
- 变量定义:通过
VAR明确当前索引、是否工作日、上一索引等变量,提升代码可读性与维护性 - 上一行值引用:使用
CALCULATE+FILTER+ALL精准获取上一Index对应的Projected Workable与Pack Commit值,解决同列递推引用问题 - 额外规则处理:
ActualPreviousConsumption判断上一日预计工作量是否小于6000,动态调整实际消耗值 - 休息日逻辑:直接返回0,符合“不工作”的业务规则
内容的提问来源于stack exchange,提问作者rf_dante
相关产品推荐
相关产品推荐

