Power BI中基于日历与任务表的S曲线平滑计算求助
解决Power BI中项目S曲线未完成任务进度计算问题
原公式核心问题
- RELATED函数误用:在Calendar表的计算列中,无需使用
RELATED('Calendar'[Data]),直接引用当前行的'Calendar'[Data]即可,RELATED用于从关联表多端向一端取值,此处逻辑完全错误。 - DATEDIFF参数顺序颠倒:你需要计算的是
(日历日期-任务开始日期),但原公式中写成了(日历日期到任务结束日期),导致计算结果完全不符合预期。 - 筛选条件逻辑不严谨:原筛选未明确任务实际开始日期与当前日历日期的关系,可能错误包含未启动的任务。
- 未处理分母为0的情况:若任务开始和结束日期相同,会出现除以0的风险,需特殊处理。
修正后的计算列DAX公式
Parciais = VAR CurrentDate = 'Calendar'[Data] RETURN CALCULATE( SUMX( MSP_EpmTask_OlapView, VAR TaskStart = MSP_EpmTask_OlapView[Início] VAR TaskEnd = MSP_EpmTask_OlapView[Término] VAR TaskDuration = DATEDIFF(TaskStart, TaskEnd, DAY) + 1 // 包含首尾日期的任务总天数 VAR ElapsedDays = DATEDIFF(TaskStart, CurrentDate, DAY) + 1 // 从任务开始到当前日期的已过天数(含当日) VAR ProgressRatio = DIVIDE(ElapsedDays, TaskDuration, 0) // 用DIVIDE避免除以0,异常时返回0 RETURN MSP_EpmTask_OlapView[Valor Planejado] * ProgressRatio ), MSP_EpmTask_OlapView[É Resumo] = FALSE(), // 筛选当前日期处于任务执行期间的未完成任务 MSP_EpmTask_OlapView[Início] <= CurrentDate, MSP_EpmTask_OlapView[Término] > CurrentDate, // 确保任务已按计划启动 MSP_EpmTask_OlapView[Início Agendado] <= CurrentDate )
更推荐的度量值写法(动态计算更灵活)
如果用于报表可视化,度量值比计算列更高效——它是动态计算的,不会提前占用内存存储所有日期的计算结果:
Parciais_Measure = VAR SelectedDate = MAX('Calendar'[Data]) RETURN CALCULATE( SUMX( MSP_EpmTask_OlapView, VAR TaskStart = MSP_EpmTask_OlapView[Início] VAR TaskEnd = MSP_EpmTask_OlapView[Término] VAR TaskDuration = DATEDIFF(TaskStart, TaskEnd, DAY) + 1 VAR ElapsedDays = DATEDIFF(TaskStart, SelectedDate, DAY) + 1 VAR ProgressRatio = DIVIDE(ElapsedDays, TaskDuration, 0) RETURN MSP_EpmTask_OlapView[Valor Planejado] * ProgressRatio ), MSP_EpmTask_OlapView[É Resumo] = FALSE(), MSP_EpmTask_OlapView[Início] <= SelectedDate, MSP_EpmTask_OlapView[Término] > SelectedDate, MSP_EpmTask_OlapView[Início Agendado] <= SelectedDate )
关键说明
- 用
VAR定义变量简化逻辑,提升公式可读性和计算效率。 - 调整筛选条件,确保只计算已启动且未完成的任务进度。
- 使用
DIVIDE函数处理分母为0的边界情况(如当日完成的任务)。 - 若任务表有专门的「完成状态」字段(如
[Status] = "未完成"),可加入筛选条件进一步精准识别未完成任务。
内容的提问来源于stack exchange,提问作者Arthur Leal
相关产品推荐
相关产品推荐

