一题多解 | Power BI 中不显示当前月的另一种方法


在《Power BI中不显示当前月的一种方法》这篇文章中,我们介绍了一个特殊的业务场景——PowerBI视觉对象仅显示已经过去的完整月份的数据,而不显示目前正处于的月份的业务。并提供了一种可行的解决方案。整个过程包括:

  1. 对日期表年月序号字段进行排名
  2. 计算今天日期对应的排名
  3. 用今天日期的排名和日期表的每个日期排名比较
  4. 最后在可视化对象中应用筛选

今天我们为大家介绍如何在Power Query中实现同样的效果。为方便演示,实际的数据中仅包含今年日期(2019/1/1 ~ 2019/12/31)和年月(YearMonth)字段,截图(部分)如下:
file

Step1:计算今天的日期

在PQ中没有Today()函数,我们使用DateTime.LocalNow()返回当前系统的日期时间,再用Date.From返回今天的日期。
file

Step2:计算今天日期所在月份的开始日期

file

这里用到的函数是Date.StartOfMonth,该函数包含一个参数,返回给定日期所在月份的开始日期。

Step3:用当前日期的月初日期和Date列做比较

file

Date列中的日期小于当前日期对应的月初日期返回TURE,大于返回FALSE。在可视化对象中,将“是否返回”字段添加到筛选器,勾选为TRUE就可以了。
当然,这里介绍的方法和上一篇文章中的方法是两种截然不同的思路。这个方法也可以通过DAX写计算列实现。有的小伙伴可能会问:上一篇文章中介绍的思路可以用M实现吗?答案是肯定的,不过这个过程用M写出来对新手很不友好,我们不做深入探讨。这里,我们仅提供代码及注释,有余力的小伙伴可以参考下。

let
源 = Excel.Workbook(File.Contents("D:\Data.xlsx"), true, true),
Calendar_Sheet = 源{[Item="Calendar",Kind="Sheet"]}[Data],

 //添加排名字段,用当前行的年月值和年月列的不重复值作比较,返回比当前行年月值小的值,最后计数即为排名
#"排名"= Table.AddColumn(Calendar_Sheet, "排名", each List.Count(List.Select(List.Distinct(Calendar_Sheet[YearMonth]),(x)=>x<[YearMonth]))+1),

 //添加今日排名字段,用DateTime.LocalNow()取到今天的日期时间,用该时间在上一步骤的排名表中查找对应的排名
#"今日排名" = Table.AddColumn(#"排名","今日排名",each Table.SelectRows
(#"排名",(x)=>x[Date]=Date.From(DateTime.LocalNow()))[排名]{0}?),

// 添加是否返回字段,用今日排名和所有的日期排名做比较,当前行日期排名比今日排名小的行即为当前月前的日期
#"是否返回"= Table.AddColumn(#"今日排名","是否返回",each [排名]<[今日排名])

in
   是否返回

最终结果如下:

file

今天的分享就到这里,小伙伴们下次再见。

  • PowerPivot工坊原创文章,转载请注明出处!

    如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

Power Pivot工坊