Power BI之DAX神功:答网友问14 HASONEFILTER与HASONEVALUE的区别,你问错了!
一、网友提问
《火力全开》笔记第16课 HASONEFILTER函数【判断是否被筛选】
它与HASONEVALUE函数的区别是什么?
二、HASONEVALUE函数
这完全就是两个风马牛不相及的函数!孙兴华和孙悟空是什么关系?都姓孙,好像没关系,你要偏说孙兴华是孙悟空的转世,我也没办法,因为以我现在掌握的科学技术暂时还不能证明你说的不对,等我哪天能证明自己是天马座星矢的转世时,你的谎言就被拆穿了:)
《DAX神功》第2卷第19回我们讲了 HASONEVALUE函数
既然问了我们就讲一下,别权威指南说这两个函数类似你就觉得类似,可能是外国人和国人的表达方式不同,张三工资10000元(正规企业员工),李四工资10000元(电信诈骗),结果是一样的,但是过程可真的不相似。
我们还是使用《孙兴华讲PowerBI火力全开》打包课件中的 16.xlsx文件

【度量值】总分 = SUM('案例1'[成绩])
【度量值】HASONEVALUE总成绩 = if(HASONEVALUE('案例1'[姓名]),[总分],Blank())

如上图所示↑:度量值【HASONEVALUE总成绩】:对姓名列去重,放在当前上下文中如果只有一行,就显示度量值【总成绩】否则显示Blank()。这是典型的让总计显示为空的公式。但是当我筛选赵六时:如下图所示↓

因为只有一个赵六,所以矩阵上筛选出来的只有赵六,总计也只有一个赵六就是有唯一值所以总计也会显示198。如上图所示↑

如上图所示↑:当我选择两个人时,筛选这两个人,但是总计就不是唯一值了,因为它包含张三和赵六,所以总计显示为空。
【重点】当我将行标题换成【老师】字段时

如上图所示↑:因为老师中只有李小龙和叶问拥有唯一行,所以默认显示李小龙和叶问,总计因为不只一个学生(默认是张三、李四、王五、赵六四个学生,我没筛选),所以显示为Blank()。

如上图所示↑:当我筛选赵六时,他的老师是叶问和宋浩,为什么总计仍然显示?因为学生姓名是唯一值呀!仔细观察你的公式:
【度量值】HASONEVALUE总成绩 = if(HASONEVALUE('案例1'[姓名]),[总分],Blank())
你的HASONEVALUE('案例1'[姓名])里面的参数是,'案例1'[姓名]。
Ps: 学语言重点是阅读理解和写作,而不是发音。--名言出自:郑强教授
以上言论有各大网站都可以找到郑强教授视频,有视频有真相。
孙兴华补充:发音和错别字不重要,除非你从事特殊的职业,全民理解中国话才是最重要的。
三、HASONEFILTER函数
【度量值】HASONEFILTER总成绩 = if(HASONEFILTER('案例1'[姓名]),[总分],Blank())
作用:当指定的列有且只有一个由直接筛选产生的值时,返回 true。

如上图所示,我一个都没筛选,所以返回Blank()
如下图示所,我选了两个,不符合只有一个直接筛选产生的值这个要求,所以还是返回Blank()

以上两种情况,HASONEFILTER('案例1'[姓名]) 返回值都是False
只有下面这种,我只选了一个人的时候,HASONEFILTER('案例1'[姓名]) 返回True,而度量值【HASONEFILTER总成绩】返回【总成绩】
如下图所示,赵六同学对应的老师是宋浩和叶问

四、其实你应该问HASONEFILTER、ISCROSSFILTERED和ISFILTERED三个函数的区别
《DAX神功》第2卷第20回 我们已经讲了ISCROSSFILTERED和ISFILTERED区别
【1】HASONEFILTER(参数) // 参数被筛选时,只筛选一个返回True,筛选多个或无筛选返回False。
【2】ISFILTERED(参数) // 参数可以是表也可以是列,判断指定表中的列或指定表中所有列是否被筛选,被筛选返回True(无论筛选几个),没被筛选返回False。
【3】ISCROSSFILTERED(参数)// 是否具有经过传递的筛选,小弟出事大哥不一定被抓(也许大哥不知道小弟做了坏事),反之,大哥出事小弟跑不了,大哥一端表领导多端表的小弟。详见电影《古惑仔》电影系列

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

