如何用DAX计算指定时间段内工作项的完成工时差值?
计算工作项完成工时增量的DAX表达式修复方案
我有一个数据集,每条记录对应一个工作项的一次更新(每天最多更新一次),包含WorkItem、CompletedWork、ChangedDate三个字段,示例数据如下:
| WorkItem | CompletedWork | ChangedDate |
|---|---|---|
| 12392 | 4 | 01/04/23 |
| 12392 | 4.5 | 03/04/23 |
| 12394 | 1 | 02/04/23 |
| 12394 | 4 | 07/04/23 |
| 12530 | 6 | 06/05/23 |
需求是编写DAX表达式计算各时间段内的完成工时增量,用于制作X轴为周维度的折线图,展示时段内完成的工时。自行编写的DAX代码无法正确运行,代码如下:
CompletedWorkDifference = SUMX ( VALUES ( Task_Revisions[WorkItemId] ), VAR CurrentRowWorkItemId = Task_Revisions[WorkItemId] VAR CurrentRowChangedDate = Task_Revisions[ChangedDate] VAR PreviousCompletedWork = CALCULATE ( LASTNONBLANK ( Task_Revisions[CompletedWork], 1 ), FILTER ( ALL ( Task_Revisions ), Task_Revisions[WorkItemId] = CurrentRowWorkItemId && Task_Revisions[ChangedDate] < CurrentRowChangedDate ) ) VAR CurrentCompletedWork = Task_Revisions[CompletedWork] RETURN IF ( PreviousCompletedWork <> BLANK (), CurrentCompletedWork - PreviousCompletedWork, BLANK () ) )
问题分析与修复方案
原代码的核心问题在于迭代逻辑不匹配上下文、历史工时获取方式精准度不足,导致无法正确计算时段内的增量。以下是修复后的DAX表达式:
CompletedWorkDifference = SUMX ( -- 迭代每个工作项的所有更新记录 Task_Revisions, VAR CurrentWorkItem = Task_Revisions[WorkItem] VAR CurrentDate = Task_Revisions[ChangedDate] -- 获取当前工作项在当前日期之前的最新完成工时 VAR PreviousWork = CALCULATE ( MAX ( Task_Revisions[CompletedWork] ), FILTER ( ALL ( Task_Revisions ), Task_Revisions[WorkItem] = CurrentWorkItem && Task_Revisions[ChangedDate] < CurrentDate ) ) -- 计算增量:有历史记录则取差值,首次记录可按需返回初始工时或空值 RETURN IF ( NOT ISBLANK ( PreviousWork ), Task_Revisions[CompletedWork] - PreviousWork, -- 若需将初始工时计入对应时段,替换为 Task_Revisions[CompletedWork],否则保持BLANK BLANK () ) )
使用注意事项
- 确认
ChangedDate字段为日期/时间类型,避免文本格式导致日期比较错误 - 按周维度展示时,需在模型中创建日期表,建立与
Task_Revisions[ChangedDate]的关系,使用日期表的周字段作为折线图X轴 - 若需要将工作项的初始工时(首次记录的
CompletedWork)计入对应周的增量,可修改返回部分的BLANK()为Task_Revisions[CompletedWork]
内容的提问来源于stack exchange,提问作者Zabman
相关产品推荐
相关产品推荐

