这个是最近比较好玩的案例了。
不过解决方案不是我想的。很久之前Tony同学就和我说过这个solution,当时没有在意。最近我也做这个change,才发现这个solution真的挺好玩的。
先说下需求吧。
如下图所示:主表中有三个内容,一个关于Color的Slicer,一个Others表,一个Selected表。
要求,在Color筛选Slicer里面选中任意的Color内容:
在"Others"表里面显示全部的Color的Quantity的和,但是不包括选中的Color内容;在“Selected"表里面显示选中的Color的Quantity的和。
Selected表没啥可说的,就是最常规的一个表;不过有一点,如果什么Color都没有选择的时候,Selected表默认应该是空的。
说到这里,可能大家已经能想到一些应用场景。
场景举例:如上图所示,可能Black,Silver和White这三个Color最近在做活动,比如满减,捆绑销售,或者打折什么的。这样必将影响总体销量。如果分析的时候,可以把已知做活动的Color先拿出来,然后再看其他Color的销量情况,占比变化等。
接下来,分析下已知内容。
对于Power BI Report中的Visual表:Others Table和Selected Table。他们里面的内容,都是一个维度信息(Color)和一个聚合数字(Quantity)。 聚合数字和Color筛选Slicer是没有关系的,聚合数字只是根据显示的不同的Color,来显示汇总值。所以计算聚合数字(Quantity)的时候,Others Table要考虑忽略Color的筛选Slicer的变化影响。而Selected Table,按照常规做就可以。
这个案例,简单来说就是:当启动了Color筛选器之后,Others Table要隐藏被选择的内容,Selected Table要显示被选择的内容。
在现有Product表的Color字段和Sales表的Quantity字段来说,对于选择了的Color筛选Slicer的内容,怎么做都不能实现Others Table里面的隐藏被选择内容。所以,肯定是要新建一个表来做辅助表了。
1. 点击New table, 定义辅助表Dim_Color的DAX内容如下:
Dim_Color = DISTINCT('Product'[Color])
2. 建立关系
3. 创建度量值Hide_Show处理对于筛选Color控制显示和隐藏的Flag (巧点)
Hide_Show = IF(NOT(ISFILTERED('Product'[Color])),0, IF(SELECTEDVALUE('Product'[Color]) in VALUES('Dim_Color'[Color]), 1,0))
这个DAX写的挺巧妙的。简单,但是功能强大。
4. 创建度量值Quantity_Sum,DAX内容如下:
Quantity_Sum = CALCULATE(SUM(Sales[Quantity]),ALL('Product'[Color]))
这个主要是用在Others Table里面的。为了不受选择了的Color 筛选Slicer影响,这里用了All函数。
5. 建立一个Others Table如下图所示
Others Table,设置Hide_Show永远为0.
建立Selected Table如下图:
Selected Table,设置Hide_Show永远为1.
NB!Others Table和Selected Table里面的Color字段来自于辅助表Dim_Color中的Color字段;
Color筛选Slicer来自于Prodcut表的Color字段;
Others Table和Selected Table这两个Visual,要添加Visual级别的Filter。
最终效果:随便选了几个Color,如下图所示。Others表里是不包括选中的Color,Selected表里是包括选中的Color。
默认情况下,如下图所示:
这么做下来好像也还可以。对Product表的Color字段,既然做了筛选Slicer,它就是一个子集了。在Others Table里,我们首先需要一个Color全集,然后隐藏筛选Color子集。Product表的Color字段不可能即做子集又做全集,所以我们创建了辅助表Dim_Color。这里Hide_Show这个Flag蛮巧妙的。挺好的体现了Simple but not easy.
本文得到了Tony同学的Solution授权。并且Tony同学提供了很多很好的意见和建议,丰富了这篇文章的内容和细节。谢谢!
谢谢关注!