提升DAX水平必知必会的核心概念:扩展表

教育   2024-08-19 12:18   河南  
这篇文章来介绍一个可以帮助我们理解DAX运行逻辑的核心概念:扩展表。
关于扩展表,你可能没有听说过,但是如果你写过一些度量值,应该都用到过,虽然用的时候并不知道它的存在。
或者你已经理解了模型关系的基本筛选方式,但是有的DAX的计算结果却出乎你的意料,这很可能也是因为没有理解扩展表。
先来看一个简单的示例,以PowerBI星球案例模型来说明,模型图是这样的:
如果想找出每个产品对应的客户都多少?用产品表的产品名称作为上下文,写个度量值:

客户数量 = COUNTROWS('客户表')


由于产品表并不能直接筛选客户表,所以这个度量值的结果都是相同的,都是全部客户的计数。
但是如果我们改一下度量值:

客户数量 = CALCULATE(COUNTROWS('客户表'),'订单表')


这样就可以正确计算出结果了:
从模型上来看,产品表依然不能筛选客户表,为什么在CALCULATE中添加个订单表作为参数就可以筛选了呢?
要理解这个计算原理,就需要先理解扩展表。

什么是扩展表?
模型中每个表都有对应的扩展表,除了它自身,还包括与它建立一对多关系的一端的表。
就上图的PowerBI星球案例模型中的这几个表来说,4个维度表都与订单表建立的一对多的关系,则4个表都是订单表的扩展表,或者说,订单表的扩展表就是整个模型的所有表。
而上面的4个维度表,没有与他们建立一对多关系的1端的表,则它们的扩展表都只有他们自身。
并且扩展表是可以根据一对多关系传递的,为了说明这个规则,假如还有个产品类别表,与产品表建立一对多的关系,如下图:
根据上面关于扩展表的介绍,产品表是订单表的扩展表,而产品类别表是产品表的扩展表,那么产品类别表也是订单表的扩展表。
在上图中:
  • 订单表的扩展表:整个模型的所有表

  • 产品表的扩展表:产品表和产品类别表

  • 其他表的扩展表:只有它们自身

假如你建立的是我们常用的星型模型,则事实表周围的维度表,都是该事实表的扩展表。


扩展表有什么用?
DAX计算筛选不仅仅是基于表面的模型关系,更深层次其实是扩展表在起作用。
筛选任何一个扩展表时,视同筛选本表。
以筛选产品表为例,由于产品表是订单表的扩展表,则筛选产品表的产品名称,比如耳机,则视同筛选订单表,将订单表中所有耳机的订单筛选出来,这就是我们通常理解的按模型关系来筛选。
筛选本表时,视同筛选本表的所有扩展表。
扩展表是一个整体,可以看作是模型背后的一张更大的表,当筛选了本表时,视同筛选它扩展后的这张大表,这就可以解释本文开头示例的计算逻辑。
由于产品表和客户表之间没有模型关系,产品表不能筛选客户表,但是当度量值写成:

客户数量 = CALCULATE(COUNTROWS('客户表'),'订单表')


订单表作为CALCULATE的筛选器参数,订单表的扩展表是模型中的所有表,当外部的产品名称筛选订单表时,视同筛选模型中的所有表,当然也包括客户表,所以它能正常计算出每个产品的客户数量。
这个规则可能就不是你通常理解的模型关系逻辑了,扩展表与模型关系有关,但是它又突破了常规的模型关系筛选。
以上就是理解扩展表的一个简单的例子,后面也会介绍更多扩展表的日常应用场景。
希望本文能帮你解开DAX计算逻辑的一些疑惑,当你理解了扩展表以后,相信你的DAX运用水平也将进一步提升~



PowerBI星球的最新版内容合辑,值得你收藏学习:
「PowerBI星球」内容合集


如果你想深入学习Power BI,欢迎加入PowerBI星球学习社群,获取更多学习资源,和6k+ 深度学习者一起精进~

PowerBI星球
海量干货,帮你轻松上手 Power BI
 最新文章