Power BI中半累加计算的解决方案

文摘   职场   2024-09-01 15:41   广东  

    小伙伴们,大家好!今天和大家分享实际工作中,我们经常会遇到的计算场景:半累加计算。这个名词可能大家比较陌生,接下来小编的分享会通过案例和大家一起深入浅出的理解。

    半累加计算是指在被某些维度列筛选的时候是一种聚合方式(例如,SUM),在被另外一个维度筛选的时候使用另外一种聚合方式(例如,计算最后日期的值),银行余额案例、月末库存等都是很好的例子。例如,我们看所有的客户余额是每个客户的余额之和,但是,全年的余额并不是每个月的余额之和,而是取一年中最后一天的余额,下面的例子中如果要计算客户Jordan 2010年第1季度的余额那么显然不是求和而是求2010-3-31这天的金额,这种情况,我们称之为半累加计算。

解决半累加的计算场景,比较常用的函数是LASTDATE/LASTNOBLANK,接下来我们通过对这个案例分别介绍两个函数的用法和特点。
  1. LASTDATE函数:

    数返回的是一个只包含一行的表,该行表示当前筛选上下文中可见的最后一个日期,当其用作CALCULATE的筛选器参数时,LASTDATE覆盖日期表的筛选上下文,只保留所选区间的最后一天。

    1. 年份层级:返回的是本年最后一天

    2. 季度层级:返回的是本季度最后一天

    3. 月份层级:返回的是本月的最后一天

通常这个函数可以用来计算月末库存或者月末存款余额的场景(注意:只适用于每个月末都有值的情况)

01.LastDate = LASTDATE('Date'[Date])


02.LastDateSalesAmount = CALCULATE ( [Sum of Balance], LASTDATE ( 'Date'[Date] ) )

    回到上面我们提出的问题计算Jordan这个客户Q1的余额,这里面计算的是正确的,并没有将M1+M2+M3的值进行累加,而是取了Q1的季度末的值。但是,这里面计算仍然有个问题:我们只看到了Q1、Q2的数据,Q3的数据缺失,实际上我们数据源是有Q3的数据的。这个回到我们LASTDATE函数本身返回的值来思考,返回的是当前筛选上下文的时间段中最后的日期。Q3的那么实际上返回的是Q3的季度末最后一天的数据,7月则返回的是7月的最后一天的数据,那么LASTDATE函数作为CALCULATE函数的筛选条件则是2010-07-31,显然这天我们是没有数据的,所以,结果返回的是空值不显示。这个时候需要引出一个新的函数LASTNOBLANK.

  1. LASTNOBLANK函数:

如果在当前筛选上下文的最后一天之前的日期是有值,但是,月末最后一天没有数据,那么这种情况下更好的解决方案是LASTNOBLANK函数。此函数是一个迭代函数,它会去扫描一个表,并返回第2个参数不为空时所对应的表的最后一个值。例如,我们在月份级别使用这个函数时,它迭代该月的每个日期,检查余额表对应的记录是否为空。

03.LastNoBlank = LASTNONBLANK ( 'Date'[Date], [02.LastDateSalesAmount] )

04.LastNoBlankAmount = CALCULATE ( [Sum of Balance], LASTNONBLANK ( 'Date'[Date], [Sum of Balance] ) )

看上去这个结果几乎是正确的了,但是在Q3的汇总上我们看到的是1950的值,DAX计算表达式计算没错,使我们的代码还不够完善。但是,这个奇怪的问题是为什么?答案是我们这个汇总的值返回的是2010-7-18的值,如果需要显示是这3个客户的汇总,可以对DAX表达式进行如下调整即可。
05.LastNoBlankAmountRevised = SUMX (    VALUES ( 'Balances'[Name] ),    CALCULATE ( [Sum of Balance], LASTNONBLANK ( 'Date'[Date], [Sum of Balance] ) ))

PowerBI Home
分享PowerBI、Tableau、Excel(函数公式、数据透视表、VBA)、Python、SQL等技巧。
 最新文章