Power BI DAX计算去年同期工作日返回空白的问题求助
Power BI度量值获取去年同期工作日数返回空白问题解决
场景还原
原度量值可正常计算当前所选年月的工作日数:
Measure = VAR selYear = SELECTEDVALUE('Stats Param LindyCalendar'[Date].[Year]) VAR selMonth = SELECTEDVALUE('Stats Param LindyCalendar'[Month]) VAR selDay = day(now()) VAR enddate = DATE(selYear, selMonth, selDay) VAR CurWorkingDay = COUNTROWS( FILTER( FILTER('Stats Param LindyCalendar', 'Stats Param LindyCalendar'[Date].[Date] <= enddate), 'Stats Param LindyCalendar'[WorkingDay_YN] = -1)) RETURN CurWorkingDay
配置三个切片器:Country表筛选国家、Stats Param LindyCalendar年份切片器、月份切片器,调整参数时原度量值工作正常。但修改selYear = SELECTEDVALUE('Stats Param LindyCalendar'[Date].[Year])-1后,卡片视觉对象返回空白。
核心原因
切片器选中当前年份后,度量值继承了该筛选上下文,Stats Param LindyCalendar表中仅保留当前年份的日期数据,修改后的selYear指向去年,但此时表中无去年日期记录,导致计算返回空白。
解决方法
方法1:清除年份筛选上下文(保留其他筛选)
通过CALCULATETABLE配合ALL清除年份筛选,让度量值能访问去年的日期数据,同时保留国家、月份等其他筛选条件:
LastYearSamePeriodWorkingDays = VAR selYear = SELECTEDVALUE('Stats Param LindyCalendar'[Date].[Year]) - 1 VAR selMonth = SELECTEDVALUE('Stats Param LindyCalendar'[Month]) VAR selDay = DAY(NOW()) VAR enddate = DATE(selYear, selMonth, selDay) VAR LastYearWorkingDay = COUNTROWS( FILTER( CALCULATETABLE('Stats Param LindyCalendar', ALL('Stats Param LindyCalendar'[Date].[Year])), 'Stats Param LindyCalendar'[Date].[Date] <= enddate && 'Stats Param LindyCalendar'[WorkingDay_YN] = -1 ) ) RETURN LastYearWorkingDay
如果需要更精准保留用户已选的非年份筛选,可替换ALL为ALLSELECTED:
LastYearSamePeriodWorkingDays = VAR selYear = SELECTEDVALUE('Stats Param LindyCalendar'[Date].[Year]) - 1 VAR selMonth = SELECTEDVALUE('Stats Param LindyCalendar'[Month]) VAR selDay = DAY(NOW()) VAR enddate = DATE(selYear, selMonth, selDay) VAR LastYearWorkingDay = COUNTROWS( FILTER( CALCULATETABLE('Stats Param LindyCalendar', ALLSELECTED('Stats Param LindyCalendar'[Date].[Year])), 'Stats Param LindyCalendar'[Date].[Month] = selMonth && 'Stats Param LindyCalendar'[Date].[Date] <= enddate && 'Stats Param LindyCalendar'[WorkingDay_YN] = -1 ) ) RETURN LastYearWorkingDay
方法2:使用时间智能函数DATEADD(更简洁)
利用Power BI内置时间智能函数DATEADD直接定位去年同期日期,简化计算逻辑:
LastYearSamePeriodWorkingDays = VAR CurrentEndDate = DATE( SELECTEDVALUE('Stats Param LindyCalendar'[Date].[Year]), SELECTEDVALUE('Stats Param LindyCalendar'[Month]), DAY(NOW()) ) VAR LastYearEndDate = DATEADD(CurrentEndDate, -1, YEAR) RETURN COUNTROWS( FILTER( 'Stats Param LindyCalendar', 'Stats Param LindyCalendar'[Date].[Date] <= LastYearEndDate && 'Stats Param LindyCalendar'[WorkingDay_YN] = -1 && 'Stats Param LindyCalendar'[Date].[Month] = SELECTEDVALUE('Stats Param LindyCalendar'[Month]) ) )
注意:使用时间智能函数前,需确保Stats Param LindyCalendar已标记为日期表(建模选项卡设置)。
额外检查点
- 确认
Stats Param LindyCalendar表中存在去年对应年月的日期数据,且WorkingDay_YN字段正确标记工作日(值为-1)。 - 检查Country表与日历表的关系筛选方向,若为单向筛选,需确保不会阻止去年日期数据的读取。
内容的提问来源于stack exchange,提问作者Matthias Müller
相关产品推荐
相关产品推荐

