请求协助:统计指定时间段内的Opened Tickets数量(DAX代码优化)
统计指定时间段内处于Opened状态的工单解决方案
需求分析
需要统计在选定年月结束时,状态为Opened的工单数量。核心逻辑是确定每个工单在统计周期结束日的最终状态,再筛选出状态为Opened的工单。
原代码问题分析
第一种DAX代码问题
- 筛选条件偏差:使用
NOT(Fac_Jira[IdStatus] IN {[Closed], [Finished], [Cancelled]})会包含prepared等非目标状态,无法精准定位Opened状态。 - 范围限制过窄:仅统计状态变更日期在指定时间段内的记录,若工单最后一次状态变更在时间段之后,会遗漏该工单在时间段内的有效
Opened状态。
第二种DAX代码问题
- 初始筛选错误:
Fac_Jira[CreationDate] > DATE(2024, 06, 01)会排除2024年6月1日及之前创建的工单,导致数据不全。 - 逻辑完全倒置:
NOT([LastDateState] IN {[Opened], [Finished], [Cancelled]})混淆了日期和状态字段,且错误排除了目标Opened状态。
正确DAX实现
VAR _SelectedMonth = SELECTEDVALUE(DimCalendarIssues[Month]) VAR _SelectedYear = SELECTEDVALUE(DimCalendarIssues[Year]) VAR _PeriodEnd = EOMONTH(DATE(_SelectedYear, _SelectedMonth, 1), 0) // 获取每个工单在周期结束前的最后一次状态变更记录 VAR _LastStatusBeforeEnd = ADDCOLUMNS( SUMMARIZE( FILTER(Fac_Jira, Fac_Jira[statusChangedDate] <= _PeriodEnd), Fac_Jira[idissue], "MaxStatusDate", MAX(Fac_Jira[statusChangedDate]) ), "CurrentStatus", CALCULATE( MAX(Fac_Jira[Status]), FILTER( Fac_Jira, Fac_Jira[idissue] = EARLIER(Fac_Jira[idissue]) && Fac_Jira[statusChangedDate] = EARLIER([MaxStatusDate]) ) ) ) // 处理周期内创建但无状态变更(或变更在周期后)的工单,默认创建状态为Opened VAR _NewTicketsWithoutChange = SELECTCOLUMNS( FILTER( Fac_Jira, Fac_Jira[creation] <= _PeriodEnd && NOT(Fac_Jira[idissue] IN SELECTCOLUMNS(_LastStatusBeforeEnd, "Issue", [idissue])) ), "idissue", Fac_Jira[idissue], "CurrentStatus", "Opened" ) // 合并数据并筛选Opened状态的工单 VAR _OpenedTickets = FILTER( UNION(_LastStatusBeforeEnd, _NewTicketsWithoutChange), [CurrentStatus] = "Opened" ) RETURN COUNTROWS(DISTINCT(_OpenedTickets))
代码解释
- 周期日期计算:通过选定的年月计算统计周期的最后一天
_PeriodEnd。 - 获取最后状态:筛选所有状态变更日期不晚于周期结束日的记录,按工单分组取最后一次变更的状态。
- 处理新工单:对于周期内创建但无有效状态变更记录的工单,默认其状态为
Opened(符合工单创建初始状态的常规逻辑)。 - 统计结果:合并两类工单数据,筛选出状态为
Opened的工单并去重计数。
内容的提问来源于stack exchange,提问作者David Molina
相关产品推荐
相关产品推荐

