想起别人说过的一件事情,在项目最后测试阶段,发现几次测试都是相同的数据问题。急脾气,就和报表开发人员说,结果不对,而且错了几次都是相同的问题,和你说过了,为什么没有改?那个报表开发人员沉默了一会说,报表没有错误。我当时笑了。现在回头这么多年看看,是挺傻瓜的。
之前做过一个需求,主要是用Excel做的数据源的Power BI分析报表。最近要加一个需求,做一个关于Customer Name的Slicer,其中Customer Name主要来自于两个事实表中的Customer Name。因为两个事实表中的Customer Name都不能完全覆盖到全部的Customer Name,所以就涉及到了如何从两个事实表中抽取出全部Customer维度信息的方法。
也有其他的方法,不过想到集合函数了,就用这个集合函数解决了。
Customer = VAR a = VALUES('Billing Amount All'[Customer name])VAR b = VALUES('AR Balance Raw Data'[Customer name])VAR c = INTERSECT(a,b)VAR a_c = EXCEPT(a,c)return UNION(a_c,b)
结果就是没有重复值的全部的Customer Name维度信息了。
下面我们就仔细说下这三个集合函数。
首先,强调一点,在使用这三个函数之前,要保证我们操作的集合中的列的数量,和数据类型都是一样的。
如下图所示,创建了两个表,都包含三个列,列的类型也都是一样的。一个是“A.Datum”品牌的所有颜色的销量,另一个是“Proseware”品牌的所有不同颜色的销量。
两边的颜色有交集,但是又不完全一样。如果想做一个Color的Slicer对两个表都起作用,那就要从新建一个Color table。
新建一个table:
一步一步来验证几个函数。
VALUSE
VALUSE_color = VALUES(Datum[Color])
首先用VALUES函数取出来了每个表中的Color的数据。这里我只用Datum表做一个演示。如下图所示。
2. 用UNION函数来连接两个表中的Color
UNION_color = UNION(VALUES(Datum[Color]),VALUES(Proseware[Color]))
UNION这个函数里面有点类似SQL里面的UNION ALL,他保留重复数据,所以得到的结果如下:
这样的结果是不能和数据表“Datum”或者“Proseware”做关联的。因为表里面的“Black”会糊涂,不知道和union_Color里面的哪个Black关联啊。
所以也就是说UNION函数虽然做了并集,但是重复数据还在。
如下图所示,就是C多算了一次。
然后看INTERSECT函数。这个是取交集的函数,就是上图中的C部分。
INTERSECT_color = INTERSECT(VALUES(Datum[Color]),VALUES(Proseware[Color]))
结果如下图所示
那现在我们根据已知条件可以得到并集和多余的C,还可以得到C,是不是就要用减法了呢?
A+B+C-C.
好像是对的。而且我们还有EXCEPT这个函数。但是这里有一个问题,减的时候,你怎么确定减掉的是多余的C而不是A和B的交集C呢?事实上直接减,会减掉两个C。
这个时候可以再UNION一次,把in_color加上。也是一个选择。
总结如下:
这个还是挺有意思的。你可以通过一些汇总函数SUMMARIZE或者CALCULATETABLE得到一定的子表,然后用这些函数进行组合的。有个印象就好,一个思路。
谢谢关注。