Power BI同比计算报错:Date表NewMinPeriod列无法识别或不可用
Power BI 同比期间汇总报错解决办法
问题场景
需实现同比值对比:用户通过切片器选择多个连续的Period(格式YYYYMM,位于Date表),一个度量值展示所选期间的汇总工时,另一个展示去年同期的汇总工时。注:不按自然日期汇总,存在跨期交易,且无法在Date表中创建计算列,仅能使用度量值。
已创建的度量值:
- Date表中的两个度量值:
NewMinPeriod = VALUE(CONCATENATE(LEFT(MIN('Date'[Period]),4) - 1, FORMAT(MID(MIN('Date'[Period]),5,2),"00")))
NewMaxPeriod = VALUE(CONCATENATE(LEFT(MAX('Date'[Period]),4) - 1, FORMAT(MID(MAX('Date'[Period]),5,2),"00")))
- Time事实表中的两个度量值:
BetweenPeriodWorkHours = CALCULATE( SUM(Time[HoursWorked]), FILTER( 'Time', 'Time'[PeriodKey] >= MIN('Date'[Period]) && 'Time'[PeriodKey] <= MAX('Date'[Period]) ) )
BetweenPreviousPeriodWorkHours = CALCULATE( SUM(Time[HoursWorked]), FILTER( 'Time', 'Time'[PeriodKey] >= MIN('Date'[NewMinPeriod]) && 'Time'[PeriodKey] >= MAX('Date'[NewMaxPeriod]) ) )
错误信息
BetweenPeriodWorkHours可正常返回数据,但BetweenPreviousPeriodWorkHours抛出报错:
The report measure 'Time'[BetweenPreviousPeriodWorkHours] has a syntax error at line 6, position 40, reported by Analysis Services: 'Column NewMinPeriod' in table 'Date' cannot be found or may not be used in this expression'.
中文翻译:
报表度量值'Time'[BetweenPreviousPeriodWorkHours]在第6行第40位存在语法错误,Analysis Services报告:无法找到表'Date'中的列'NewMinPeriod',或者该列不能在此表达式中使用。
错误原因
NewMinPeriod和NewMaxPeriod是度量值而非Date表的物理列,不能用MIN('Date'[NewMinPeriod])这种引用列的方式调用,需直接引用度量值本身。- 原度量值逻辑存在错误:
Time[PeriodKey] >= MAX('Date'[NewMaxPeriod])应为<=,否则筛选的是大于等于最大同期值的范围,不符合同期区间的筛选需求。
修正后的度量值
直接调用Date表的度量值,同时修正逻辑运算符:
BetweenPreviousPeriodWorkHours = CALCULATE( SUM(Time[HoursWorked]), FILTER( 'Time', 'Time'[PeriodKey] >= 'Date'[NewMinPeriod] && 'Time'[PeriodKey] <= 'Date'[NewMaxPeriod] ) )
简化方案(可选)
也可将同期计算逻辑直接整合到目标度量值中,无需额外创建NewMinPeriod和NewMaxPeriod度量值:
BetweenPreviousPeriodWorkHours = VAR SelectedMinPeriod = MIN('Date'[Period]) VAR SelectedMaxPeriod = MAX('Date'[Period]) VAR PrevMinPeriod = VALUE(CONCATENATE(LEFT(SelectedMinPeriod,4)-1, FORMAT(MID(SelectedMinPeriod,5,2),"00"))) VAR PrevMaxPeriod = VALUE(CONCATENATE(LEFT(SelectedMaxPeriod,4)-1, FORMAT(MID(SelectedMaxPeriod,5,2),"00"))) RETURN CALCULATE( SUM(Time[HoursWorked]), FILTER( 'Time', 'Time'[PeriodKey] >= PrevMinPeriod && 'Time'[PeriodKey] <= PrevMaxPeriod ) )
内容的提问来源于stack exchange,提问作者jabs
相关产品推荐
相关产品推荐

