Power BI之DAX神功:第4卷第3回 计算列创建关系中的循环依赖
民间有句俗语:
天堂有路你不走,地狱无门你自来。
--意为自讨苦吃,不懂变通
用这句话来形容今天要讲的知识,太恰当了!
一、前景回顾

上节课一定有人会说,序号直接就可以获取:
但是,你将两张表通过序号建立关系时,提示循环依赖:

上节课我用Switch的方法成功避坑!当然原理我要讲,可是我上节课要先讲如何避坑。然后我再证明DAX原理在很多情况下他是化简为繁:)
你明知有人一小时后即将来打你,你不选择报警,而选择准备武器跟他打仗,那就是互殴。你能用Switch避开,你就是不用,你用DAX原理,就要付出沉痛的代价。
上节课,我是在建立关系后使用这个公式,我不需要讲原理,学到这个阶段都看得懂这个公式,但是现在我没有建立关系,使用了这个公式,我就讲清楚原理。
二、Filter凭什么可以无关系筛选?
明确的告诉你:Filter本身是无法做到无关系筛选的。那为什么上面的公式做到了呢?

在两张表无关系的情况下使用新建表:
返回结果:肯定是找不到客户表中的指定列

但是在新建列里面就可以了

你先回答我一个问题,我对客户表做新建列,是不是在客户表里面的操作,那我在filter中指定的'客户表'[消费金额]是不是指当前行消费金额?就这么简单。如果你说不是这样的,那我证明给你看:
是不是当前行的会员卡号与当前行的姓名连接:

那为什么我通过这种方法新建的序号列不能与区间表序号列建立关系呢?
三、单循环依赖
两个表连线为什么会出现循环依赖呢,权威指南的解释:Values检测空行,而Distinct不检测空行。让我们将Values改成Distinct。原理:详见《DAX神功》第1卷第9回
我们这个案例没有空行,只是DAX在设计之初考虑到了这个问题,担心你以后可能会通过Values产生空行,造成已经连线的关系出错,干脆就不让你直接使用可能产生空行的函数。
举个例子:我现在要招聘一个政治老师,两个应聘者:张三和李四,笔试和试讲二者都在伯仲之间,但是张三英语比美国新闻主持人还厉害,我承认张三是个很强的人,但是我这里庙小,张三应该有更大的发展空间,所以我为了安全起见,我选择李四。(当然如果招聘英语老师我肯定选张三)
一定会有小伙伴说,你不是说过满足实时参照完整性的表,就可以避开原理吗?现在又用上原理了,怎么解释呀?我刚刚在上面说过了:你能用Switch避开,你就是不用,你用DAX原理,就要付出沉痛的代价:)
现在就可以连线了:

四、Calculate中避免使用布尔筛选器
上面我们提到了VALUES检测空值,DISTINCT不检测空值,同理,ALL检测空值,ALLNOBLANKROW忽略空值。
假设上一个公式return后面写成
Calculate([度量值],'表[列]'="筛选条件")
因为它的等价公式:这个知识点在之前的课程中至少提到了10次以上
Calculate([度量值],filter(ALL('表[列]'),'表[列]'="筛选条件"))
ALL就是检测空行,ALLNOBLANKROW不检测空行,所以你必须写成
五、双循环依赖
有些小伙伴又要问了,如果客户表是下面这样,有重复,我们需要先聚合再判断

《DAX神功》第1卷第20回 循环依赖什么鬼?我们讲过原例
当我用客户表新建列的序号列与区间表序号列建立关系时,我们假设关系建立成功了,他们就是一对多关系,多端表的扩展表包含一端表所有列。(这是扩展表原理)

一对多关系,一端表(区间表)的序号可以筛选多端表(客户表)的序号(新增列),但是多端表(客户表)的序号因为是行上下文,它在生成时还被自己表其它3列进行筛选。这又是循环依赖。详见《DAX神功》第1卷第20回 循环依赖什么鬼?
所以你不能将度量值写成:
要写成:原理《DAX神功》第1卷第20回 讲过了不再重复
然后我们重新写客户表中的序号列公式:
这样就可以了,你不知不觉中处理了两次循环依赖,这就是DAX原理

六、SELECTEDVALUE内有隐藏Values
《DAX神功》第2卷第19回 我们讲到了什么情况下,使用SELECTEDVALUE函数代替IF+HASONEVALUE组合
IF(HASONEVALUE(字段名), VALUES(字段名),否则返回什么)
等价
SELECTEDVALUE(字段名,否则返回什么)
一旦你使用了SELECTEDVALUE默认内部嵌套了VALUES,又出现了检测空行的问题,这时你必须使用: IF(HASONEVALUE(字段名), DISTINCT(字段名),否则返回什么)
七、总结
如果你相信我,用了《DAX神功》第1卷第20回 循环依赖什么鬼?讲的方法,也就是上节课SWITCH避坑,VALUES、ALL、SELECTEDVALUE....就全部避开了。

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
《DAX神功番外篇》文字版合集:
https://www.bilibili.com/read/readlist/rl478271
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等