隐藏

Power BI之DAX神功HASONEVALUE和SELECTEDVALUE函数

发布:2024/11/14 12:29:15作者:管理员 来源:本站 浏览次数:298

一、HASONEVALUE函数


《火力全开》笔记16.进阶条件判断函数 我们对今天要讲的两个函数已经进行了案例讲解,今天来讲原理。


HASONEVALUE函数最常用的功能:让总计/小计显示为空


表名:Sheet1


【度量值】计算季初至今



行标题和值设置图



2021年合计和总计显示的是2021年最后一个季度的值,这是正确的


如果你想将其变成2021年全年总和与整表总合,详见《DAX神功》第2卷第4回


如果你想让他变成空,就可以使用我们学过的If+HASONEVALUE 组合


【新建列】月 = MONTH('Sheet1'[日期])


【度量值】QTD改 = if(HASONEVALUE('Sheet1'[月]),[QTD])


行标题和值设置图



套公式大家都会,但是今天我们讲原理,以上面的案例为依据,我们解读一下:


【度量值】Values = COUNTROWS ( VALUES ('Sheet1'[月]) ) = 1


【度量值】DISTINCT = COUNTROWS ( DISTINCT('Sheet1'[月])) = 1


【度量值】HASONEVALUE = HASONEVALUE(Sheet1[月])


以上三个公式等价(人为制造障碍除外,比如一端表没有的主键,在多端表外键中出现了,这属于不懂数据库基本常识,即便是人为失误,也应该在数据清洗环节处理干净)


原理学会了,我们拓展一下思路:假设只有一个月份就返回这个月份应该怎么做?


【度量值】拓展思路 = if(HASONEVALUE(Sheet1[月]),DISTINCT('Sheet1'[月]))


// 《DAX神功》第1卷第10回 将表用作标量值


上面的案例,我们使用IF+HASONEVALUE组合,我们返回的是:如果月份去重后只有一行,我们就返回这个月份,否则返回Blank()。如果我想返回「二哈到底哈不哈」怎么办?


【度量值】拓展思路 = if(HASONEVALUE(Sheet1[月]),DISTINCT('Sheet1'[月]),"「二哈到底哈不哈」")


二、SELECTEDVALUE函数


上面的案例我们使用了,


IF(HASONEVALUE(字段名), VALUES(字段名),否则返回什么)



IF(HASONEVALUE(字段名), DISTINCT(字段名),否则返回什么)


在这种情况下我们也可以使用SELECTEDVALUE函数代替IF+HASONEVALUE组合


注意:只限在这种情况下


如果某字段去重后只有一行,就以标量值返回生成的表,否则返回空,如果注明了否则返回什么就返回什么,例如「二哈到底哈不哈」


IF(HASONEVALUE(字段名), VALUES(字段名),否则返回什么)



IF(HASONEVALUE(字段名), DISTINCT(字段名),否则返回什么)


等价于


SELECTEDVALUE(字段名,否则返回什么)


【度量值】拓展思路1 = SELECTEDVALUE(Sheet1[月],"「二哈到底哈不哈」")


三、SELECTEDVALUE函数应用


讲这个应用之前我们先复习一下:Switch


DAX中的Switch比任天堂的Switch要厉害多了,我为了找到二者区别,在2021年1月买了一台任天堂的Switch做对比,发现任天堂的Switch太LOW了,他只能在掌机和主机模式下切换。相比DAX下的Switch,任天堂还需努力哦:)


如上图所示,如果Switch第1参数返回的是1,就返回"一月";以此类推

我们看一下《火力全开》中的案例:


表名:Sheet2


【新建列】参数表 = {"销售数量","销售金额","毛利额"}


详见《DAX神功》第1卷第3回 表名规范与表构造函数


我们将参数表的Value字段放到切片器上:


并且在设置中将切片器单选:


我们每次是不是只能选一个?


【度量值】SELECTEDVALUE = SELECTEDVALUE('参数表'[Value])


再对比我们的Switch函数:


切换 =


switch(SELECTEDVALUE('参数表'[Value]),


"销售数量",sum('Sheet2'[销售数量]),


"销售金额",sum('Sheet2'[销售金额]),


"毛利额",sum('Sheet2'[毛利额])


)