admin 管理员组

文章数量: 887021


2024年2月23日发(作者:office怎么求平均分)

Excel PowerPivot DAX表达式related和relatedtable函数详解

大家都直到,PowerPivot是Excel最新加入的数据库分析工具,它和PowerQuery,PowerMap,Powerview构成了Excel Power BI的核心功能模块。而这些组件都是基于数据库的,它属于一种列式存储,效率比Excel工作表的单元格存储更高。对于PowerPivot而言,大多数Excel工作表函数仍能在“添加列”中正常使用,但是有些函数是不能直接使用的,尤其在关系型数据库中很重要的vlookup函数,在PowerPivot中是无法直接使用的,但是数据建模中的本质就是基于公共列的关系的建立,所以PowerPivot中必定存在专门解决这类问题的函数,今天给大家介绍其中的两个:related和relatedtable函数。它们的功能比vlookup更强,是PowerPivot的专属函数。

【软件版本】Excel 2019 家庭学生版

一、问题背景介绍

大家都知道,说到数据建模,常常离不开“一”端和“多”端两个概念,下面通过两张表来解释这两个概念(这两张表我已经事先从工作表导入到了PowerPivot中,导入方法不再赘述)。

现有两张表:

①销售明细表

②商品分类对照表

观察以上两张表(销售明细表;商品分类对照表),我们不难发现几个特点:

①两个表有一个公共列:“商品名称”列;

②在“销售明细表”中的“商品名称”,由于有很多笔销售记录,所以同一个商品名称可能反复出现多次,这也符合事实情况;

③在“商品分类对照表”中的“商品名称”,没有重复值,每个商品名称都是唯一不重复的;

我们通常诸如“销售明细表”的这类表格称为“事实表”,又可以称为“多”端表(有重复项),

而把“商品分类对照表”这类表成为“维度表”,又可以称为“一”端表(无重复项)。

二、related和relatedtable函数用法介绍

函数的用法(类似于vlookup函数的功能)

那么,按照常规的Excel操作中的数据透视表,如果这两个表不在PowerPivot而在Excel中,如果我要分析每一个“商品分类”的总销售金额是多少:通常的做法是,通过vlookup在“一”端表中查到对应的“商品分类”,然后返回给“多”端表中对应的行。然后把匹配好了商品分类的“多”端表(宽表),导入数据透视表进行分析即可。

但是在PowerPivot中不能使用vlookup,所以我们就需要使用related函数来替代它的功能,但是要使用related函数有个前提条件:就是先要对发生关系的两个表格的公共列进行数据关系建模。

听着高端,其实我们打开“关系图视图”中(单击按钮即可打开视图),

把一个表的公共列(即“商品名称”)鼠标拖动到另一个表的公共列上即可:

松开鼠标,看到以下的标记:

其中“1”标记,表示“一”段表(或称“维度表”),

其中“*”标记,表示“多”端表(或称“事实表”)。

表示数据建模成功!

那么,既然related函数和vlookup函数类似,肯定就是用于把“商品分类对照表”中的“商品分类”通过建模使用的公共列“商品名称”匹配到“销售明细”表中了,这就是vlookup的功能,和related函数是一样的。

那么怎么使用related函数呢?

我们把鼠标定位到“销售明细”表最右侧的“添加列”中的任意单元格,

然后再顶部的公式编辑栏输入:=related(‘商品分类对照表’[商品分类])

然后回车,即可把“商品对照分类”表中的“商品分类”字段匹配到“销售明细”表中来。

效果如下图所示:

怎么样?是不是和vlookup完全一致?

而且由于之前进行了数据建模,related函数写起来也比vlookup更加简单,

related只有一个参数:‘表名’[字段名]

这就是related函数的基本用法:即利用建模的公共列,用于把“维度表”表中其他字段信息匹配到“事实表”中,它的功能和vlookup完全一致!

table函数的用法

那么既然related函数和vlookup一样,relatedtable函数是干嘛用的呢?其实,relatedtable的用处和related刚好相反:是把“事实表”(或称“多”端表)的信息,利用数据建模关系,查询匹配到“维度表”(或称“一”端表)中。

那么大家肯定有疑问了,“一”端表中每个“商品名称”只有一行记录,而“多”端表中“商品名称”有很多重复的记录,通过“商品名称”匹配到“一”端表中,那“一”段表总共就有10行,岂不要炸掉?一行格子怎么放下这么多行“多”端表中的记录呢?

哈哈,这个问题其实很简单,你想想我们做数据透视表的时候,几万行的数据,我们的值字段怎么最后就就变成了一个几十个格子的二维表呢?答案很很简单,就是有“聚合”,我们数据透视表中的“值汇总方式”就是一种“聚合”,同样的道理,如果“一”端表中放不下这么多行“多”端表所匹配的数据,我们就把这能够对的上的N行数据做一个“聚合”(或者称为“汇总”),称为一个单一的数值,不就可以放到一行中了吗?

所以,我们在“一”端表中使用relatedtable函数时,如果外面不嵌套任何一种类型的“聚合”函数,它就会报错,比如下面这样:

假设这里我们须要在“一”端表中,通过“商品名称”获取它在“多端”表中的所有行,由于有很多行匹配的“商品名称”记录存在,对应的“销售额”自然无法放在一行中显示,于是会报错:

那么,我们只有在外部嵌套一个聚合函数,才能把这重复的N行数据聚合成一个数值,也才能放进一行中进行显示,比如:我们可以使用countrows等聚合函数:

这里我们就以countrows为例,可以理解为求每个“商品名称”的有多少笔销售记录。

值得注意的是:relatedtable函数针对是整个表,而非表中的某一个字段,比如我们无法通过relatedtable来查询每个“商品名称”的总的销售金额是多少。

正式因为relatedtable引用的是整个表格,如其名“table”,所以它也只有一个参数:即须要引用过来的表的表名,所以如果统计每个“商品名称”有多少行交易记录,正确的写法应该是:

=countrows(relatedtable(‘销售明细’))

如此一来,我们就在“一”端表中,得到了每个“商品名称”的销售记录的行数。

【拓展延申】

能否把“多”端表和“一”端表中通过“商品名称”匹配的某一个字段(例如“销售额”等),汇总到“一”端表中呢?

其实也可以,但是这里牵扯到一些其他的知识,这里只提供方法,不展开讲原理。

=calculate(sumx(‘销售明细’, ‘销售明细’[销售额], ‘销售明细’[商品明细]= ‘销售明细’[商品明细])

三、本篇总结

今天主要给大家讲了PowerPivot中的两个函数:related和relatedtable。其中related的功能和Excel工作表函数vlookup是相同的,而relatedtable的功能,相当于是把建模列匹配的表格行整行从“多”端抓取到“一”端,所以须要使用聚合函数countrows匹配。其实今天讲的都是最基础的内容,relatedtable构建的表格行也可以和其他的DAX函数进行嵌套使用,但不属于本节介绍的内容。

须要注意的是,无论是related还是relatedtable函数,都必须先在PowerPivot中完成数据建模才能使用!此外,relate和relatedtable的参数都只有一个,related的参数是:表名+字段名,而relatedtable的参数是:表名。前者返回匹配的某一个字段中的行,而后者返回的是若干个匹配的整行(包含有多列)构成的一个微型表格。


本文标签: 函数 数据 商品名称 使用 匹配