美文网首页工具癖PowerBI专栏Power BI干货
星友分享:如何设置Power BI图表的默认上下文?

星友分享:如何设置Power BI图表的默认上下文?

作者: PowerBI星球 | 来源:发表于2019-07-29 19:06 被阅读22次

    星友 AgnesJ 分享的 PowerBI 小技巧,在存在外部切片器的情况下,如何设置图表的默认值呢,下面直接进入正文。

    如何设置Power BI图表的默认值?

    AgnesJ

    Power BI 里经常用到切片器,但切片器设置里并不能直接设置默认初始值,比如要实现每次打开Power BI时,在切片器没发生筛选的情况下,让图表自动显示最近一天,该怎么设置呢?

    想要实现Power BI 视图都能默认显示最近一个月的销售额,要怎么做呢?

    最近在做一份2010年到2019年的销售记录报表时,遇到了这个问题。客户要求一打开报表,所有与切片器连接的视图都默认显示当前年度的销售额,也就是说,我需要对我的日期切片器设置一个默认初始值:当前年份。

    默认值 = 切片器中没有选择时所取的值,一旦切片器中有任何一个选择,默认值就应该消失。如果切片器中没有选择,则切片器所取的列上没有过滤器直接作用,这使我立即想到ISFILTERED函数。

    ISFILTERED  直接过滤columnName时返回TRUE  。如果列上没有过滤器,或者由于正在过滤同一表或相关表中的不同列而发生过滤,则该函数返回  FALSE。

    下面,我会用由两个表组成的简单模型给大家做一个演示。

    数据样本:一张销售表和一张日历表。

    数据来源 :微软提供样本数据库的AdventureWorks2012

    报表内容:一个切片器用于筛选年份,一个直方图包含总销售额关于销售员ID的分配情况。

    使用“日历”[年份]的年份切片器

    直方图显示每一个“销售额”[销售员ID]的[总销售额]

    现在,我们要确保当切片器没有被筛选时,直方图将显示2014年的总销售额情况,也就是说如果“日历”[年份]没有被过滤,销售总额将会是2014年的销售总额。

    思路一旦出来,DAX语句也就很好写出来了:

    Total saleswithDefault2 =IF(ISFILTERED(Calender[Year]),SUM('Sales SalesOrderHeader'[SubTotal]),    CALCULATE (SUM('Sales SalesOrderHeader'[SubTotal] ),FILTER('Calender',Calender[Year]=2014)    )  )

    是不是很简单呢?嘻嘻。

    那么,如果某个视图连接了多个切片器,该怎么办?比如下面这种情况:

    三个切片器:'日历'[年] /'日历'[月] /'日历'[日期],任意一个切片器或组合都可以对视图进行筛选。

    依然很简单,抓住ISFILTERED再找 OR 来帮个忙就好啦!

    创建一个度量值[IsAnySlicerFiltered?],当这三个切片器中没有任何选择时,谁将返回False,并且当有任意一个切片器被筛选时将返回True。

    IsAnySlicerSelected? = OR(OR(        ISFILTERED(Calender[Date]),ISFILTERED(Calender[Month])),    ISFILTERED(Calender[Year]) )

    现在,只需要用ISFILTERED(Calender [Year])替换[IsAnySlicerFiltered?] ,就可以实现我们的目标了。

    Total saleswithDefault3=IF(    [IsAnySlicerSelected?],SUM('Sales SalesOrderHeader'[SubTotal]),    CALCULATE (SUM('Sales SalesOrderHeader'[SubTotal] ),FILTER('Calender',Calender[Year]=2014)    ))

    这就搞定一个视图链接多个切片器的情况咯!

    让我们来看看效果:

    但DAX的功能那么丰富,用ISFILTRED 函数绝对不是唯一解决方案,比如,我们可以换一种思路来定义切片器的默认初始值:

    默认初始值 = 切片器没有进行选择= 切片器所属列被筛选的行数为0,也就是说我们可以用计行数来解决,COUNTROWS 一下。

    如果被筛选的行数是默认值( Power BI会默认全选 ),那么结果就为初始默认值,否则默认值就失效。

    这里需要借助两个中间度量值,来为我们确定是否切片器被筛选。其中一个用来记录当前切片器的选择值,我们称其为[CurrentSelection?]

    CurrenctSelection? = COUNTROWS(DISTINCT(ALLSELECTED(Calender[Year])))

    另外一个为切片器所包含列的所有可能性,[TotalSelection?]。

    TotalSelection? =COUNTROWS(DISTINCT(ALL(Calender[Year])))

    这里用到了DAX家族里功能十分强大的ALL 函数 和ALLSELECTED 函数。

    Et voilà,如果 [CurrentSelection?] = [TotalSelection?],那么我们就需要展示切片器的默认初始值。

    Total saleswithDefault=IF(    [CurrenctSelection?] = [TotalSelection?],    CALCULATE (SUM('Sales SalesOrderHeader'[SubTotal] ),FILTER('Calender',Calender[Year]=2014)    ),SUM('Sales SalesOrderHeader'[SubTotal]))

    下面为,使用ISFILTERED 以及 ALL 函数和ALLSELECTED 函数分别进行单一切片器初始默认值设置的演示:

    今天的分享就到这里啦,DAX可以实现的可能性真的是太多了,不但许多Power BI本身可以实现的设置都可以被DAX代替,而且DAX还可以实现许多Power BI还未更新的功能呢,这个神仙语言,真的让我难以自拔啊。

    顺便说一句,当在切片器中选择“全选”选项时,上文提到的方法都将不起作用。原因?这还用问嘛?

    感谢AgnesJ分享的实用技巧,熟练使用DAX,可以帮助我们更灵活的控制图表,也欢迎更多的小伙伴投稿分享自己的诀窍哦。


    我是采悟,PowerBI星球作者,如果你刚开始接触Power BI,可在微信公众号后台回复"PowerBI",获取《七天入门PowerBI》电子书,帮你轻松熟悉PowerBI。

    相关文章

      网友评论

        本文标题:星友分享:如何设置Power BI图表的默认上下文?

        本文链接:https://www.haomeiwen.com/subject/zryirctx.html