如何用DAX筛选指定Campaign下所有Range均为NO的产品?
DAX实现筛选指定Campaign下所有Range均为NO的产品
原始数据
| Campaign | Product | Range |
|---|---|---|
| A | Apple | YES |
| A | Banana | NO |
| A | Banana | NO |
| A | Banana | YES |
| A | Grapes | NO |
| A | Grapes | NO |
需求说明
筛选指定Campaign期间,所有Range记录均为NO的产品(即该产品在对应Campaign下从未出现过Range=YES的记录)。例如Campaign A下,仅Grapes符合要求(Banana存在YES记录,不符合)。
问题现状
使用普通Filter函数会返回所有包含Range=NO的产品(如Banana、Grapes),无法精准筛选出全部记录均为NO的产品。
DAX解决方案
1. 创建计算列标记符合条件的产品
在数据模型中添加计算列,直接标记每个产品-Campaign组合是否符合要求:
IsAllNo = VAR CurrentCampaign = [Campaign] VAR CurrentProduct = [Product] // 统计当前产品在当前Campaign下的YES记录数 VAR HasYesRecord = CALCULATE( COUNTROWS('YourTableName'), // 替换为你的实际表名 FILTER( ALL('YourTableName'), 'YourTableName'[Campaign] = CurrentCampaign && 'YourTableName'[Product] = CurrentProduct && 'YourTableName'[Range] = "YES" ) ) // 无YES记录则返回TRUE,否则返回FALSE RETURN IF(HasYesRecord = 0, TRUE(), FALSE())
添加完成后,筛选IsAllNo = TRUE即可得到目标产品。
2. 直接在视觉对象筛选器中使用表达式
无需创建计算列,直接在Power BI视觉对象的高级筛选器中使用以下DAX表达式作为筛选条件,设置为“等于True”:
CALCULATE( COUNTROWS('YourTableName'), ALLEXCEPT('YourTableName', 'YourTableName'[Campaign], 'YourTableName'[Product]), 'YourTableName'[Range] = "YES" ) = 0
3. 创建度量值用于动态交互筛选
如果需要配合切片器(如选择不同Campaign)实现动态筛选,创建如下度量值:
AllRangeNo = VAR SelectedCampaign = SELECTEDVALUE('YourTableName'[Campaign]) VAR CurrentProduct = SELECTEDVALUE('YourTableName'[Product]) VAR YesRecordCount = CALCULATE( COUNTROWS('YourTableName'), 'YourTableName'[Campaign] = SelectedCampaign, 'YourTableName'[Product] = CurrentProduct, 'YourTableName'[Range] = "YES" ) RETURN IF(YesRecordCount = 0, 1, 0)
使用时,将该度量值添加到视觉对象的筛选器中,设置筛选条件为AllRangeNo = 1即可。
内容的提问来源于stack exchange,提问作者jcoke
相关产品推荐
相关产品推荐

