BOSS:茶,那个,什么茶来着?(递过一杯茶...)
BOSS:?!!不是这个,我是说那个白茶啊!
白茶:......(懵)咋滴了,BOSS?
BOSS:哎,今年行情不行啊,能不能搞一个表,就是我选择一个颜色,就能知道这个颜色售卖的所有商品?
白茶:......(咳,咳)BOSS,这个有点难啊!
——(支付宝到账####元!)——
白茶:好嘞,马上办!
上面的都是白茶和大家开的小玩笑,但是实际上这种需求,是很普遍的一种情况。起初这个问题来源于群里小伙伴的提问,就是当我选择A、B的时候,能不能出现同时包含A、B、AB的项目?白茶一寻思,可以做到。
最后要达到上图的这种效果,该如何实现呢?
开始本期的问题—《销售需求之查找问题》。
案例文件:
这是白茶随机模拟的一份数据,一个维度表,一个销售表。
那么当我们选择维度中的数据,显示出销售表中对应颜色的销售,这个问题属于什么问题?很明显,这个属于查找问题,查找维度表中的颜色在事实表中的对应项目。
白茶翻阅了一下DAX中关于查找功能的函数,有两个函数。
FIND函数与SEARCH函数
二者在语法上是一样的:
DAX=
FIND 或 SEARCH(查找内容,被查找,[开始位置],[找不到返回值])
二者的语法结构是一致的,但是有所区别:
FIND函数区分大小写,不支持通配符;
SEARCH函数不区分大小写,支持通配符。
编写如下代码:
销售颜色: =
VAR SLL =VALUES ( '维度'[维度] )
VAR SQL =MAX ( '事实表'[颜色] )
RETURNIF ( SEARCH ( SLL, SQL,, 0 ) > 0, SQL, BLANK () )
从结果中我们不难看出,当切片器无选择时,以及多选时,其结果呈现的很明显是有问题的。
做到这里的时候,白茶思考了很久,没明白当选项为多选时,如何通过比较多个值进行结果的呈现。
感谢@冬哥。
冬哥提点了我一句,无法将多个值与查找范围进行比较,那么可以把思路反过来啊,通过反计数的方式呈现。
编写如下代码:
销售颜色 =
VAR SLL =VALUES ( '维度'[维度] )
VAR SQL =MAX ( '事实表'[颜色] )
RETURNIF (COUNTROWS ( FILTER ( SLL, SEARCH ( [维度], SQL,, 0 ) > 0 ) ) > 0,SQL,BLANK ())
当然,也可以使用FIND写法:
FIND写法 =
VAR SLL =VALUES ( '维度'[维度] )
VAR SQL =MAX ( '事实表'[颜色] )
RETURNIF (COUNTROWS ( FILTER ( SLL, FIND ( [维度], SQL,, 0 ) > 0 ) ) > 0,SQL,BLANK ())
其结果如下:
可以看得出来这次的结果没有任何问题,这种情况下SEARCH和FIND的用途是一致的。
代码含义:
通过VALUES函数,去除重复值,来提取多个值,形成一个虚拟表;
SQL这里的作用单纯的是为了将[颜色列]进行聚合,否则无法在查询函数中使用;
通过IF语句进行判断,符合条件显示,否则显示为空,内部利用FILTER函数进行上下文传递,将原本没有联系的维度和事实表中的颜色查询链接在一起。
至于其他的项目,可以通过IF进行判断决定是否显示,这里就不赘述了,最终形成下面的动图:
样例链接:http://t.cn/A62FPa3i
小伙伴们❤GET了么?
白茶会不定期的分享一些函数卡片
(文件在知识星球[PowerBI丨需求圈])
这里是白茶,一个PowerBI的初学者。