咨询:DAX中可忽略度量值筛选的ALLEXCEPT替代函数
问题描述
我在表格中创建了如下度量Value Month 1,用于显示数值及对应百分比(另有Month 2和Month 3两个度量,仅日期范围不同):
Value Month 1 = IF( ISBLANK([# Failures Month 1]), BLANK(), CALCULATE( [# Failures Month 1] & " | " & ((ROUND([% Failures Month 1] * 100 , 2) & "%")), ALLEXCEPT('AcuteAll', 'AcuteAll'[Failure Code], 'Asset Location'[Care Setting Description]) ) )
同时添加了基于度量# Failures 3 Months的表格筛选器,仅显示三个月中至少一个月故障数≥1的行:
# Failures 3 Months = IF ( [# Failures Month 1] >= 1 || [# Failures Month 2] >= 1 || [# Failures Month 3] >= 1, 1, 0 )
应用该筛选后,[% Failures Month 1]的计算结果异常。尝试将# Failures 3 Months加入ALLEXCEPT参数,但由于它是度量而非列,无法被识别。请问使用哪个DAX函数可忽略该度量的筛选来计算百分比?
解决方案
要忽略基于度量的筛选器对百分比计算的影响,可以用REMOVEFILTERS()函数清除筛选上下文,或配合KEEPFILTERS()精准保留需要的维度上下文,以下是两种可行的修改方式:
方式1:直接调整[% Failures Month 1]度量
在百分比计算的CALCULATE中加入REMOVEFILTERS(),如果需要保留Failure Code和Care Setting Description的维度上下文,就用KEEPFILTERS嵌套ALLEXCEPT:
[% Failures Month 1] = CALCULATE( DIVIDE([# Failures Month 1], [Total Failures Month 1]), -- 保留指定维度的上下文,清除其他筛选(包括基于度量的筛选) KEEPFILTERS(ALLEXCEPT('AcuteAll', 'AcuteAll'[Failure Code], 'Asset Location'[Care Setting Description])) )
方式2:在Value Month 1中单独处理百分比计算
直接在拼接百分比的部分,用CALCULATE包裹并清除筛选:
Value Month 1 = IF( ISBLANK([# Failures Month 1]), BLANK(), CALCULATE( [# Failures Month 1] & " | " & ((ROUND(CALCULATE([% Failures Month 1], REMOVEFILTERS()) * 100 , 2) & "%")), ALLEXCEPT('AcuteAll', 'AcuteAll'[Failure Code], 'Asset Location'[Care Setting Description]) ) )
核心逻辑是:基于度量的筛选属于计算后的结果筛选,REMOVEFILTERS()可以清除这类筛选带来的上下文干扰,让百分比计算回到未应用该筛选器时的状态;如果需要保留特定维度的分组逻辑,就用KEEPFILTERS()配合ALLEXCEPT锁定需要的维度。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

