自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(29)
  • 收藏
  • 关注

原创 PowerBI/DAX之理解USERELATIONSHIP函数

USERELATIONSHIP函数属于筛选调节器,可以在CALCULATE函数的计算过程中临时指定需要使用的表间关系,若指定的关系处于未激活状态,则该关系将被激活,若两表之间激活的关系超过两条,将使原来的激活关系变成未激活的状态,效果持续至其所在的CALCULATE函数计算完成。此时需要注意,由于模型关系的改变,日期表上的日期筛选器将不再筛选订购日期,而是筛选发货日期,即筛选的列的含义发生了变化,但它筛选的值还是一样的,即如上图所示的那样,每一行的日期都与订购日期相等。

2025-07-05 10:48:43 215

原创 PowerBI/DAX之理解CROSSFILTER函数

再来看下面这个案例。首先,矩阵行标签来自订单表中的客户城市字段,而要统计的产品类别信息却存储在产品表中,因此难点在于订单表逆向筛选产品表,那么这个可以使用之前介绍过的基于扩展表原理的逆向筛选的套路来解决,即下图所示的方案。另外需要注意,CROSSFILTER函数是筛选调节器,其效果持续至其所在的CALCULATE函数计算完成,并且它只修改现有模型关系的筛选器传递方向,不会影响计值环境里的任何筛选器,但由于关系箭头的指向被更改,这些筛选器能筛选的范围可能也会因此改变,但筛选的值并不会变。

2025-07-05 10:48:09 291

原创 PowerBI/DAX之理解KEEPFILTERS函数

如下图所示,矩阵的行标签与SUMX的表参数用的都是产品表的产品类别字段,即相同字段,而SUMX的第二参数使用了CALCULATE函数,因此会将SUMX提供的行上下文转换成筛选上下文,此时,行上下文转换得到的筛选器与矩阵行标签提供的筛选器属于相同列上的筛选器,因此默认的交互方式是覆盖,即用行上下文转换所得到的筛选器去覆盖矩阵行标签提供的筛选器。先来看第一个例子,如下图所示,由于相同列的筛选器的交互方式默认是覆盖行为,即用内部筛选器覆盖矩阵行标签的筛选器,因此矩阵的每一行的结果都是电脑外设的数量。

2025-07-05 10:47:32 515

原创 PowerBI/DAX之理解VAR变量

我们已经知道,后定义的变量表达式中是可以引用之前定义的变量的,并且后定义的变量名称也不能与之前定义的变量名称相同,但这只是针对单层VAR变量的语法而言的。因此,我们可以利用VAR变量仅计算一次的这个特性,在计值环境即将发生变化之前,及时地使用当前的计值环境来计算所需要的值或提取所需要的表并存储进变量里面,这样哪怕后面计值环境发生变化了,但变量的值是不会变化的,从而方便了后续的计算,进而降低了DAX表达式的复杂性。改进后的DAX表达式中,去年的销售金额仅计算一次,在保证结果正确的同时,也大大提高了计算效率。

2025-07-05 10:30:51 672

原创 PowerBI/DAX之理解行上下文转换

在之前的文章中已经详细介绍了筛选上下文,相信大家对筛选上下文已经有了深刻的理解。那么在这个基础上学习行上下文转换将会非常简单,只需要将行上下文转换的规则搞明白,立刻就可以使用筛选上下文的相关知识,从而把行上下文与筛选上下文串联起来,彻底掌握DAX的计值上下文。什么是行上下文转换行上下文转换是指为某个行上下文里包含的所有列设置筛选器,筛选的内容为各个列在此行上下文里的索引标记所对应的值,在设置完筛选器后将丢弃此行上下文。此外,由于各列在某个行上下文里所包含的索引标记都只有一个,因此在转化成的筛选器中,每个列都

2025-07-05 10:30:12 739

原创 PowerBI/DAX之理解行上下文嵌套

在第二个例子中,虽然使用了EARLIER函数指定使用第1层行上下文,但结果其实与直接引用列(默认使用最内层行上下文)时相同,因为SUMX提供的行上下文中并不存在成绩表各列的索引标记,因此外层行上下文(成绩表的行上下文)中的索引标记将递补进入最内层行上下文,所以成绩表的总分列在两层行上下文中的索引标记都相同,故无论是否使用EARLIER函数,所获取到的数据都将一样,所以上面提到的两个计算列公式等价。而行上下文的嵌套规则也很简单,即:相同列的索引标记中,后添加的具有最高引用优先级,将屏蔽或覆盖原有的索引标记;

2025-07-05 10:29:36 349

原创 PowerBI/DAX之理解行上下文

此外,DAX引擎为基础表创建行上下文时,是以基础表的扩展表为对象创建的,即基础表的行上下文里不仅包含了基础表自身列的索引标记,还包括了扩展表上其它列的索引标记,但扩展表上不属于该基础表的其它列的索引标记不能直接引用。简单来说,行上下文就是一组索引标记的集合,在迭代到某一行时,DAX引擎就会根据这个索引标记的集合来获取各个列在当前行的数据,因此,我们可以把行上下文简单理解成正在计算的当前行的所有数据,这也是最方便的理解,但明确行上下文的真正指代对我们理解与掌握行上下文是很重要的。

2025-07-05 10:29:02 203

原创 PowerBI/DAX之理解ALLEXCEPT函数

然后将过滤后的数据作为CALCULATETABLE的筛选器参数,此时,订单表的四个列以及产品表的产品类别列都会被设置筛选器,然后由于筛选器无法逆向筛选,或者说产品表的扩展表不包含订单表的任何列,因此来自订单表的那四个筛选器都无法筛选产品表,只有来自产品表的产品类别筛选器能够筛选到产品表,因此最终产品表返回类别1的数据。若ALLEXCEPT用作表函数时,将忽略任何筛选器,返回第一参数的表的扩展表中除所指定的列之外的所有列的现有值的唯一值组合,但扩展表上的列不可见。

2025-07-05 10:28:28 162

原创 PowerBI/DAX之理解ALLCROSSILTERED函数

因此,对于一对多关系与多对一关系,其上级表与下级表的划分非常清晰,对于一对一关系,则该关系的两张表互为上级表,而对于多对多关系,该关系的两张表互为下级表。1、A表与B表之间的关系为一对一关系,那么A表与B表互为上级表,因此,B表的扩展表不仅包含了B表的所有列,还包含了A表的所有列。同理,A表的扩展表不仅包含了A表的所有列,还包含了B表的所有列。2、A表与B表之间的关系为多对多关系,那么A表与B表互为下级表,因此,B表的扩展表仅包含B表的所有列,同理,A表的扩展表也仅包含A表的所有列。

2025-07-05 10:27:49 272

原创 PowerBI/DAX之理解ALL函数

本篇文章将介绍ALL函数的所有用法与细节,ALL函数是DAX的核心函数之一,它让我们能够自由地移除筛选器,是一个非常重要的函数,因此我们要彻底掌握ALL函数的每一处细节。ALL函数的语法结构语法:作用:ALL函数有两种用法,一种是作为表函数,另一种则是作为筛选调节器,ALL的作用具体如下:1、若将ALL用作表函数,将返回参数所指定的表中的所有行,或参数所指定的列的所有值去重后的单列表,忽略任何筛选器;2、若将ALL用作筛选调节器,将移除参数所指定的表的扩展表或参数所指定的列上的所有筛选器。可能有人会看不懂

2025-07-05 10:27:12 576

原创 PowerBI/DAX之扩展表原理

但是,对于产品表而言,它不存在任何上级表,所以产品表的扩展表上的列就只有产品表的自身列,并不包含订单表中的任何列,所以对于订单表中任意列上的筛选器来说,产品表的扩展表都不会跟着被筛选,这就是为什么筛选关系不能逆向传播的原因。此外,来自某列的筛选器只筛选其自身列,若有表的扩展表包含该列,那么这个扩展表也会被交叉筛选。由于产品表的扩展表不包含下级表(订单表)的任意列,因此订单表任意列上的筛选器均无法筛选产品表,只有产品表的扩展表上包含的列才能筛选产品表,即上述筛选器组合中蓝色列名的列上的筛选器才能筛选产品表。

2025-07-05 10:22:49 546

原创 PowerBI/DAX之案例-关键字筛选

总计行的值不正确是因为我们使用了MAX函数去从行标签的筛选上下文里提取当前的产品名称,当在总计行时,不再有行标签提供筛选器,使得筛选上下文里可见的产品名称有多个,而MAX函数将获取到排名最大的那个产品名称,即C产品,而C产品不包含切片器选中的任意一个关键字,所以为空。我希望跟着我学习DAX的朋友都能够灵活使用我所介绍的各个知识点,而不要死板的套用,因为我所介绍的内容都比较倾向于原理,而不是倾向于应用的套路,所以一定要自己多去练习,多多举一反三。因此,本篇文章将介绍一个小案例,用来串联之前学过的内容。

2025-07-05 10:22:05 544

原创 PowerBI/DAX之理解IF与SWITCH

此外,IF函数有一个特性,那就是当第二参数与第三参数同时存在逻辑值与空值时,会把空值强制转换成逻辑值FALSE。作用:检查第一参数的判断结果,如果为 TRUE,则返回第二参数的值,如果为FALSE则返回第三参数的值。其中,第三参数可省略,默认为空。参数的表达式的值进行判断的,因此,SWITCH的用法比较灵活。本篇文章将介绍IF与SWITCH函数的各种用法,这两个函数属于逻辑函数,虽然比较简单,但却是不可或缺的。作用:对给定的第一参数的表达式的值,依次判断是否与。参数都是表达式,第一参数的表达式的值是与。

2025-07-05 10:21:10 65

原创 PowerBI/DAX之理解VALUES与DISTINCT

造成这个现象的原因就是因为商品售价那一列上有空值,而VALUES也返回了由参照完整性不匹配而产生的空行,也就是说VALUES返回了两个空值,但因为VALUES的参数为列时是会去重的,所以就相当于将两个空值合并为了一个,也可以说是删除了一个空值,因此总计行的结果为4而不是5。可以看到,在销售表里有一个被标红了的商品编码(A05),这个商品编码在商品表中是不存在的,因此在这里就存在着参照完整性不匹配的情况,所以DAX引擎会在上级表,也就是在商品表里增加一个空白行来对应那些不匹配的销售记录。

2025-07-05 10:19:41 449

原创 PowerBI/DAX之常用迭代函数详解

DAX里的迭代函数的迭代与广义上的迭代的含义有所不同,广义上的迭代指的是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果,将每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。而在DAX里的迭代可以理解为遍历,迭代函数会遍历其参数所指定表的每一行,并为表的每一行执行相同的 DAX 表达式,在遍历完表后再根据不同的迭代函数执行不同的后续操作,例如:SUMX的后续操作是求和、MAXX的后续操作是求最大值、RANKX的后续操作是排序等等。

2025-07-04 23:29:29 398

原创 PowerBI/DAX之理解CALCULATE与CALCULATETABLE

在之前介绍筛选器的表现形式时,我们已经了解到筛选器是用元组来表示的,元组与表很相似,表可以转化成元组,但元组并不能转化成表。我们来回顾一下度量值3的计值流程,首先,由于内部筛选器参数是先在外部计值环境里计值的,使得VALUES函数返回的结果与行标签显示的一致,其次,ALL函数作为筛选调节器是优先应用的,所以行标签提供的筛选器必定被移除,使得最终剩下一个由VALUES转化来的内部筛选器,而这个内部筛选器筛选的内容又与行标签提供的筛选器筛选的内容一致,所以度量值3的结果才会与销售金额度量值的结果一致。

2025-07-04 23:28:53 747

原创 PowerBI/DAX之深入理解筛选上下文

所谓的复杂筛选还原,通常发生于固化筛选器的交互行为中,可以理解成这样:我们已经定义了一个很复杂的筛选器组合,希望度量值只在这个筛选器组合所筛选出的筛选上下文里计算,但由于疏忽了筛选器间的覆盖行为,导致这个很复杂的筛选器组合被破坏,使得结果不符合预期,那么这种情况就称为复杂筛选还原现象。之前的文章中已经说过,相同列上的筛选器的交互方式是覆盖行为,就是用新增的筛选器覆盖旧的已有筛选器,这个覆盖行为可以理解成直接移除旧的已有筛选器。最后,我们来探讨一下修改筛选上下文的理解方式,这在之前的文章中也曾简单提及过。

2025-07-04 23:27:56 574

原创 PowerBI/DAX之理解筛选上下文

在上面这个例子中,我对内层CALCULATE的外部计值环境的描述采用了筛选器的形式,当然你也可以采用筛选器组合的形式来理解,这都是没问题的,因为它们都能生成同一个筛选上下文。在上图中,只展示了单个新增筛选器去覆盖单个已有筛选器,但有时候会遇到单个新增筛选器去覆盖多个已有筛选器的情况(例如初始筛选器里有多个相同列上的筛选器),甚至还有更复杂的情况,但这都适用同一个准则,那就是用新增的筛选器去覆盖已有的筛选器,无论已有筛选器的数量有多少,只要是与新增筛选器同列的,均会被覆盖或者说是移除。

2025-07-04 23:27:18 343

原创 PowerBI/DAX之初识CALCULATE与CALCULATETABLE

我们可以把基础表以及由表函数返回的表作为内部筛选器参数,简单来说就是可以使用任意来源的表作为内部筛选器参数,但要注意不同表上各列的数据沿袭,不具备数据沿袭的列上的筛选器将不能筛选模型中的数据。因为当基础表作为筛选器时,它转化成的筛选器元组中不仅包含了该基础表自身的列,还包含了其扩展表上的其他列,这对初学者来说是很容易出错的,因此最好接受我的建议,等后续掌握了扩展表原理后再使用基础表作为内部筛选器参数,在这之前则尽量使用布尔筛选以及只有单个列的表作为内部筛选器参数。当要构造的表只有一列时,小括号可以省略。

2025-07-04 23:26:28 272

原创 PowerBI/DAX之了解筛选上下文

那么现在,筛选器位于产品表的产品类别列上,要汇总的值位于订单表的销售额列上,且产品表与订单表间的关系为一对多关系,所以行标签所提供的筛选器能够顺着关系箭头的指向去筛选订单表,这就涉及到了筛选器在表间关系上的传递过程。筛选器在表间关系里的传递过程的理解方式有两种,一种是依靠扩展表原理,另一种则是依靠筛选器的复制,其中第一种方式是最常见且最重要的,而第二种方式则是作为补充,在弱关系上才会用到,例如多对多关系、双向筛选关系等等,但也可以用第二种方式来理解任何关系的筛选传递过程,它是通用的,只是略为繁琐。

2025-07-04 23:25:49 288

原创 PowerBI/DAX之初识筛选上下文

筛选上下文在严格意义上其实是指的数据模型中所有基础表的可见数据,但一般我们只需要对某个表的数据进行聚合或计值,因此一般意义上的筛选上下文指的是我们需要进行聚合计算的那个表的可见数据。此外,若直接以筛选上下文的形式来理解计值流程的话会不太方便,因为筛选上下文其实是由若干筛选器经过交互与筛选后所生成的,当我们要修改筛选上下文时其实是通过修改现有的筛选器或筛选器组合来完成的,故别的资料上所说的筛选上下文可能会与我描述的不一致,其它资料上所说的筛选上下文可能指的是现有的筛选器或者是筛选器组合,这一点需要注意一下。

2025-07-04 23:24:51 670

原创 PowerBI/DAX之关系函数与查找

因为上级表处于关系的一端,下级表处于关系的多端,所以从下级表获取上级表的数据时必然能获取到一个标量值,而反过来的话,上级表的一行数据将对应下级表的多行数据,因此只能返回一个表。而根据数据模型我们可以知道:销售表是产品表的下级表,产品表则是销售表的上级表,那么我们就可以在销售表中使用RELATED函数来获取其上级表(产品表)中对应产品的成本价格与零售价格,然后再去计算销售金额与销售成本。虽然使用起来比较简单,但要想不出错则必须要对上级表与下级表的概念有一定的理解,而且必须要在存在基础表的行上下文时才能使用。

2025-07-04 23:03:39 557

原创 PowerBI/DAX之数据模型

以上介绍的都是基础性的知识,我相信你们在看完上面的内容后很可能会好奇这个筛选关系是怎样传递的,而这些更具体的内容将在后面的文章中介绍,在介绍完前置内容后,我将一步一步地带领你们完善DAX的思维模式,敬请期待!本篇文章将介绍数据模型的相关知识。数据模型是DAX的灵魂,所有DAX表达式的计算都离不开数据模型,因此能否掌握好数据模型的知识关系着以后DAX的学习难度,建议把本文所介绍的所有知识点都记忆下来。

2025-07-04 23:02:39 215

原创 PowerBI/DAX之查询与新建表

此外,在Power BI中并没有提供查询的功能按钮,因为已经有类似的新建表功能了,通过新建表功能来返回我们需要的表,然后用完就删掉刚新建的表,这样虽然麻烦一点,但也可以达到查询的目的。下面介绍一下在Power Pivot中如何使用查询功能,首先,在Excel界面下的数据选项卡中的现有连接按钮里找到DAX引擎中的任意一个表,然后以表的形式将数据返回到Excel中,然后在返回的表中的任意单元格里右键选择【表格】,再选择【编辑DAX】按钮,即可调出查询编辑框,然后输入查询的DAX表达式即可。

2025-07-04 23:02:05 351

原创 PowerBI/DAX之度量值

是的,它们非常类似。但是在DAX中,我们不需要像调用自定义函数那样手动的输入参数,因为度量值会自动地从它所处的计值环境中获取数据,所以度量值的使用非常依赖于外部计值环境,这就要求我们必须对计值环境有较高的理解,否则就很容易出错或得到一些奇怪的结果。度量值的管理也是一项很重要的工作,在一个实际项目中,往往会新建大量的度量值,如果不对度量值进行一定的管理的话,那么肯定会很麻烦,不利于工作。本篇文章将简单介绍一下度量值的概念,以及度量值的注意事项,并给出一些管理度量值的方法。度量值的最终计算结果必须为标量值。

2025-07-04 23:00:30 218

原创 PowerBI/DAX之计算列

而在DAX中是没有单元格的概念的,最小的单位是列,所以在计算列中的每一个值都是由同一个计算列公式所计算出来的。虽然计算列公式是一样的,但是由于行上下文的存在,所以计算列中的每一个值的结果也是不一样的。所谓的计算列其实就是指的向基础表中添加新的一列,该列的每一个值都是由我们所定义的计算列公式计算得出,并且每一个值都为标量值。可见,添加计算列的过程与在Excel中添加新的一列的过程是基本一致的,但两者还是略有区别的。本篇文章将简单介绍计算列的使用,以及关于计算列的一些注意事项。

2025-07-04 22:59:49 101

原创 PowerBI/DAX之书写规范与基础函数

从上面的书写规范中可以看出,度量值与列的引用方法都是可以带表名或不带表名的,若两者均带上表名或均不带表名,那么在一个比较复杂的DAX表达式中,将很难判断哪个是度量值引用、哪个是列的引用,这样就给我们阅读DAX表达式带来了不必要的麻烦。所以我们有一个约定俗成的书写规则,即:度量值的引用不带表名,而列的引用则带表名。那么在上面的对比中我们可以发现,未格式化的DAX表达式是不易于阅读的,它的各个函数以及参数均不容易区分,而格式化后的DAX表达式则没有这个缺点,是易于阅读的。表的引用方法:‘TableName’

2025-07-04 22:59:05 374

原创 PowerBI/DAX之运算符与数据类型

一般来说,我们无需重点关注数据类型,因为数据在存储的时候我们就已经设置好了各个数据的数据类型了,而且当需要手动转换成指定的数据类型时,IDE也会自动给出数据类型的名称提示,所以我们不需要背下各种数据类型的名称,大概了解下即可。变体类型指的是一个表达式的结果有可能存在两种或以上的数据类型,当我们使用了IF函数且各个结果分支所返回的值的数据类型都不一致时,该表达式的结果的数据类型即为变体。数据类型的自动转换是根据运算符来判断的,运算符会自动把参与运算的值的数据类型转换成合适的类型,转换失败则报错。

2025-07-04 22:58:19 387

原创 PowerBI/DAX之学前准备

在之前,我也写过一些关于DAX的文章,但由于是第一次写技术性的文章,在行文方面过于枯燥且撰写一篇文章往往需要花费大量时间,导致最初的热情无疾而终。而且,随着我的技术的提升,再回头看过去写的文章,发现存在一些错误。因此,我将重新梳理DAX的知识体系,并以简洁朴素的行文风格来提炼DAX的核心要点,希望能帮到更多有需要的朋友!在正式开始学习DAX之前,我们先来了解一下有哪些工具是可以使用DAX的,以及这些工具的获取方式等等。从这篇文章开始,我将陆续分享整个DAX知识体系的核心要点,并辅以简要说明。

2025-07-04 22:56:16 124

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除