Power BI实用技巧:利用DAX隐藏未来日期的计算

文/陆文捷

物流供应链优化分析师,Power BI爱好者,知乎:Beethovenist

Power BI中日期智能函数进行同环比和累加等计算时,如果事实表数据是随时间动态更新,同时数据模型中的日期表已包含所有年份的完整日期,那么在报表和视图中会因多个日期智能相关度量值同时展现多出未来日期的部分:

示例中的利润数据在订单事实表中的记录截至2018年6月15日(按订单日期),这之后的利润均为缺省值,把年度至今的利润度量值放入报表,

利润.新.YTD=CALCULATE( [利润.新] , DATESYTD( '日期表'[日期] ) )

7-12月份的数据分别出现了缺省和重复,虽然符合计算逻辑,但用户的设计初衷并不想呈现最大订单日期以后的数据汇总。
本文探讨如何在Power BI中对涉及日期智能函数的非必要行进行隐藏,使报表呈现更自然。

一种方法是通过计算列,判断日期表的每个日期是否大于事实表的最大订单日期,

大于最后订单日期= '日期表'[日期] <=MAX( '订单表.新'[订单日期] )

要在报表中不显示还未发生订单交易期间的年度至今利润,结合DAX的运算逻辑,即是通过设立筛选条件排除相应的日期,辅助列正是为该目的而建的。

CALCULATE的兄弟函数CALCULATEABLE可以用来筛选表,用该函数和辅助列的值(True或False)筛选出符合条件的日期来用作CALCULATE的第二参数进行计算,

利润.新.YTD.ByClaculateColumn=
CALCULATE (
[利润.新],
CALCULATETABLE (
DATESYTD ( '日期表'[日期] ),
'日期表'[大于最后订单日期] = TRUE )
)

经过这步处理,年度至今的利润汇总就不再会有7-12月期间的重复.

推而广之,该方法可作为处理此类问题的标准套路:

CALCULATE(
    [度量值],
    CALCULATETABLE (
        <日期智能函数> ( 日期),
        '日期表'[大于最后订单日期] =TRUE
    )
)

固定的搭配可实现其他度量值和日期智能函数的组合应用。例如计算去年同期利润:

利润.新.YTD.PY.ByClaculateColumn=
CALCULATE(
[利润.新],
CALCULATETABLE(
SAMEPERIODLASTYEAR ( '日期表'[日期] ),
'日期表'[大于最后订单日期] = TRUE
)
)

可以看到筛选了日期后,当年(2018)7-12月尚未发生交易期间被筛选不做计算。以此进一步计算同比增长率(YOY%)就避免了上年(2017)利润与当年(2018)7-12月期间的利润(此时均为0)在业务逻辑上的无效运算。

细心的小伙伴还可以注意到201706期间利润为11,098,而201806期间的去年同期结果为5,713,并不相等,想一想这是为什么?

以上,新增计算列结合固定DAX套路,极为便利地隐藏了非必要行。但是还做不到一招鲜吃遍天,如果作为筛选判断依据的特定日期是动态变化的,以及通过DirectQuery直连模式访问数据无法新增计算列的情况下,这个方法就难以应付了。

此时从DAX的角度通过IF的条件判断筛选日期汇总:

利润.新.YTD.ByMeasure=
VAR
LastOrderDate =CALCULATE ( MAX ( '订单表.新'[订单日期] ), ALL ( '订单表.新' ) )
VAR
FirstDayInSelection =MIN ( '日期表'[日期] )
VAR
ShowData = ( FirstDayInSelection <= LastOrderDate )
VAR
Result = IF ( ShowData, CALCULATE ( [利润.新], DATESYTD ( '日期表'[日期] ) ) )
RETURN
Result
度量值内用IF判断日期表日期是否在最大交易日期之内也起到了和借助计算列筛选日期同样的作用。

同样的套路计算去年的年度至今利润:

利润.新.PY.ByMeasure=
VAR
LastOrderDate =CALCULATE ( MAX ( '订单表.新'[订单日期] ), ALL ( '订单表.新' ) )
VAR
FirstDayInSelection =MIN ( '日期表'[日期] )
VAR
ShowData = ( FirstDayInSelection <= LastOrderDate )
VAR
Result =IF ( ShowData, CALCULATE ( [利润.新], SAMEPERIODLASTYEAR ( '日期表'[日期] ) ) )
RETURN
Result
仔细对比201806期间的去年至今利润数额,用计算列筛选日期和纯DAX的方法返回不同结果。
向下钻取该期每天的数据明细进行核对:虽然逐日的去年同期结果相同,但在总计行上,计算列的方法可以做到按天的颗粒度汇总去年同期(事实表中最后交易日为2018/6/15,总计行去年同期则相应为2017/6/15),而DAX的用法只精确到了月份(总计行去年同期按2017年整个6月汇总)。

在业务逻辑上借助计算列筛选日期方法的结果更为合理,因此纯DAX的方法对于不同维度的分析不具有普适性,还得根据分析的角度控制度量值计算的数据颗粒度:

利润.新.PY.ByMeasure.Correct=
VAR
LastOrderDate =CALCULATE ( MAX ( '订单表.新'[订单日期] ), ALL ( '订单表.新' ) )
VAR
CurrentDates =FILTER ( VALUES ( '日期表'[日期] ), '日期表'[日期] <= LastOrderDate )
VAR
Result =CALCULATE ( [利润.新], SAMEPERIODLASTYEAR ( CurrentDates ) )
RETURN
Result
用FILTER以最后订单日为界限按日筛选日期表(VAR CurrentDates),进而用作计算上年利润的CALCULATE表参数,结果和辅助计算列方法殊途同归。

总结

借助计算列,按照固定套路可以实现在行级别对日期进行筛选控制日期智能函数的报表展现,简单易用;在无法编辑数据源的情况下,也可以通过DAX根据汇总数据的颗粒度,灵活改变筛选环境,达成同样效果。

参考文章:

https://www.sqlbi.com/articles/hiding-future-dates-for-calculations-in-dax/

示例数据基于PowerBI星球案例文件。

(0)

相关推荐

  • PP-DAX入门:无动态,不智能——谈谈DAX函数的计算环境(筛选上下文)问题

    小勤:BI(商务智能)到底有什么不一样啊?倒来倒去到最后不也是出一堆的图或表吗?Excel里不也可以弄吗? 大海:对的,Excel里当然也可以做图表,而且还能做得很漂亮,而且可以做得很个性化,但你有没 ...

  • Power BI Desktop 中的 DAX 基本概念

    在 Power BI Desktop 中应用 DAX 的基础知识 2019/10/21 M o 本文适用于刚开始使用 Power BI Desktop 的用户. 为你提供有关如何使用数据分析表达式 ( ...

  • Power BI可视化技巧:突出显示最大/最小区间

    之前的文章中介绍了如何突出显示最大值和最小值(PowerBI作图技巧:在走势图上标注最大值.最小值-),本文再介绍一种标记最大区间和最小区间的方法. 以销售额为例,在一段时期中,哪个30天的销售额最高 ...

  • Power BI动态技巧:突出显示下跌数据

    在之前的文章中,介绍过一种动态显示高于平均值的做法(一个度量值,完成图表的动态分组和配色),今天再给大家介绍一种动态显示下跌数据的方法. 数据模型与前面文章中的相同,首先按照月份和销售额生成一个柱形图 ...

  • Power BI可视化技巧:柱形图动态显示预算实际

    之前碰到多次星友提出类似这样的问题:展示预算和实际数据时,如果是已经发生的月份就显示实际数据,未发生的月份显示预算数据,并用不同的颜色区分,这应该怎么做呢? 接着前面关于预算分析文章的介绍,如果直接把 ...

  • Power BI可视化技巧:折线图动态显示预算实际

    上篇文章介绍了利用柱形图来动态显示预算实际的做法,本文再介绍一下用折线图实现的思路. 其实用折线图也很简单,需要的字段与柱形图相同,可以直接将柱形图切换为折线图,但切换后的效果变成了这样: 你会发现, ...

  • Power BI设计技巧:切片器的动态筛选

    经常碰到这样的需求,在报告中设置一个切片器,当用户打开报告时,默认显示的是最近一个期间的数据,比如当2020年11月30日打开报告时,显示的是2020年11月的数据,第二天再打开刷新,自动显示2020 ...

  • Power BI可视化技巧:正负值配色

    用不同的颜色标识正负值,是数据可视化的一个很常见的需求,比如正常展示每日利润的柱形图效果一般是这样的: 直接设置颜色,是无法分别按照数据的正负值来配色的,不过我们可以利用DAX来实现这种需求. 做起来 ...

  • 这个Power BI可视化技巧,你学会了吗?

    上一篇关于折线图突出显示的文章发出后,很多星友都觉得非常实用,有些同学马上就将这个技巧应用于自己的报告中了(不得不承认,行动能力太强了). 同时也遇到了一些朋友看完后,接着就找我问了很多问题,比如文章 ...

  • Power BI可视化技巧:突出标识特定事件的数据

    上一篇文章介绍了突出显示某一个期间的数据,是通过切片器来选择一个特定的期间,参考:PowerBI可视化技巧:突出显示特定期间数据 很多情况下,我们并不会随意查看某个时间段,而更关注某一个事件的影响,只 ...