You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求正确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

样本数据

IndexDateDay of Week NameCurrent WorkablePack CommitRecoveryProjected Workable(错误结果)
04/9/2024Tuesday14194600025314447
14/10/2024Wednesday060002029414294
24/11/2024Thursday060001324-4676
34/12/2024Friday060001627-4373
44/13/2024Saturday0000
54/14/2024Sunday0000

错误公式分析

原公式未实现同列上一行值的引用逻辑,也未处理“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)
        )
    )

公式说明

  1. 变量定义:通过VAR明确当前索引、是否工作日、上一索引等变量,提升代码可读性与维护性
  2. 上一行值引用:使用CALCULATE+FILTER+ALL精准获取上一Index对应的Projected Workable与Pack Commit值,解决同列递推引用问题
  3. 额外规则处理:ActualPreviousConsumption判断上一日预计工作量是否小于6000,动态调整实际消耗值
  4. 休息日逻辑:直接返回0,符合“不工作”的业务规则

内容的提问来源于stack exchange,提问作者rf_dante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:05:39