PowerBI实现商机按包含/排除指定产品筛选的方案咨询
针对你需要让用户按「包含产品」和「排除产品」筛选商机的需求,下面分两种数据源格式给出具体实现方案:
一、使用原始一对多表(Opportunities + Products)
原始表是一个商机对应多个产品的结构,直接用默认筛选会出现逻辑冲突(比如选了排除Product C,默认筛选会把包含C的商机里的其他产品过滤掉,但我们需要完全排除整个商机),所以需要通过独立切片器+DAX度量值实现:
创建独立的筛选用产品表
复制现有的Products表,分别命名为IncludeProducts和ExcludeProducts,这两个表不要和Opportunities建立任何关联。添加切片器
分别用IncludeProducts[Product]和ExcludeProducts[Product]创建两个切片器,命名为「包含产品」和「排除产品」。编写DAX度量值判断筛选条件
创建如下度量值:
符合筛选条件 = VAR 选中的包含产品 = VALUES(IncludeProducts[Product]) VAR 选中的排除产品 = VALUES(ExcludeProducts[Product]) VAR 当前商机的所有产品 = CALCULATETABLE(VALUES(Opportunities[Product]), ALLEXCEPT(Opportunities, Opportunities[Opp ID])) RETURN // 逻辑:包含所有选中的包含产品,且不包含任何选中的排除产品 IF( ISBLANK(选中的包含产品) || COUNTROWS(EXCEPT(选中的包含产品, 当前商机的所有产品)) = 0, IF( ISBLANK(选中的排除产品) || COUNTROWS(INTERSECT(选中的排除产品, 当前商机的所有产品)) = 0, 1, 0 ), 0 )
应用筛选
将「符合筛选条件」度量值拖到报表级筛选器或可视化筛选器中,设置为「等于1」。测试需求
在「包含产品」切片器选Product A,「排除产品」切片器选Product C,即可得到符合要求的商机(Opp ID=1)。
二、使用宽表格式(每行对应一个商机)
这种格式下每个商机的产品状态是布尔值,实现起来更灵活,分两种方式:
方法1:固定需求快速筛选
如果只是针对「包含Product A且不包含Product C」这个固定需求,直接添加可视化筛选器:
- 设置
Product A = True - 同时设置
Product C = False
即可直接得到目标商机。
方法2:动态用户自定义筛选
如果要让用户自由选择包含/排除的产品,步骤如下:
创建独立产品表
新建一个ProductList表,包含所有产品名称:ProductList = DATATABLE("Product", STRING, {{"Product A"}, {"Product B"}, {"Product C"}})复制这个表得到
ExcludeProductList,两个表都不与宽表关联。添加切片器
用ProductList[Product]做「包含产品」切片器,ExcludeProductList[Product]做「排除产品」切片器。编写DAX度量值
创建如下度量值:
符合筛选条件_宽表 = VAR 选中的包含产品 = VALUES(ProductList[Product]) VAR 选中的排除产品 = VALUES(ExcludeProductList[Product]) VAR 当前商机 = SELECTEDVALUE('宽表'[Opp ID]) // 检查所有选中的包含产品是否都为True VAR 包含检查 = IF( ISBLANK(选中的包含产品), TRUE(), COUNTROWS( FILTER( 选中的包含产品, SWITCH( [Product], "Product A", SELECTEDVALUE('宽表'[Product A]), "Product B", SELECTEDVALUE('宽表'[Product B]), "Product C", SELECTEDVALUE('宽表'[Product C]) ) = TRUE() ) ) = COUNTROWS(选中的包含产品) ) // 检查所有选中的排除产品是否都为False VAR 排除检查 = IF( ISBLANK(选中的排除产品), TRUE(), COUNTROWS( FILTER( 选中的排除产品, SWITCH( [Product], "Product A", SELECTEDVALUE('宽表'[Product A]), "Product B", SELECTEDVALUE('宽表'[Product B]), "Product C", SELECTEDVALUE('宽表'[Product C]) ) = FALSE() ) ) = COUNTROWS(选中的排除产品) ) RETURN IF(包含检查 && 排除检查, 1, 0)
- 应用筛选
将度量值拖到筛选器中设置为「等于1」,用户即可通过切片器自由选择包含和排除的产品。
内容的提问来源于stack exchange,提问作者Dfate

