DAX基础17:好玩的集合函数

浏览: 1669

想起别人说过的一件事情,在项目最后测试阶段,发现几次测试都是相同的数据问题。急脾气,就和报表开发人员说,结果不对,而且错了几次都是相同的问题,和你说过了,为什么没有改?那个报表开发人员沉默了一会说,报表没有错误。我当时笑了。现在回头这么多年看看,是挺傻瓜的。

之前做过一个需求,主要是用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:

一步一步来验证几个函数。

  1. 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得到一定的子表,然后用这些函数进行组合的。有个印象就好,一个思路。

谢谢关注。


推荐 1
本文由 懒胖子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册