Power BI之DAX神功:答网友问11 使用期初和期末余额
一、网友问题

二、个人想法
遇到问题时,建议你化繁为简,利用自己能听懂的知识去测试。
我们可以使用通用语言来讲清楚这件事,例如卖土豆。一年365天,每个月都有第1天和最后1天,以每个月为例,每月第1天就是月初库存,每月最后1天就是月末库存。
三、只有一张表时计算期末库存
《DAX神功》第2卷第14回已经做出详解

【度量值】平均值 = AVERAGE('Sheet1'[库存])
// 依据个人业务需求,使用Sum或Avearage函数,前者求和,后者求平均
【度量值】期末库存 = CALCULATE([平均值],LASTDATE('Sheet1'[日期]))
四、使用日期表时计算期末库存
《DAX神功》第2卷第14回已经做了证明,并不只有书中提到的方法,我们有更简单的方法,如无必要,不用LASTNONBLANK

第1步:新建动态日期表
日期表 = ADDCOLUMNS(
CALENDAR(FIRSTDATE('Sheet2'[日期]),LASTDATE('Sheet2'[日期])),
"年", YEAR ( [Date] ),
"季度", ROUNDUP(MONTH([Date])/3,0),
"月", MONTH([Date]),
"周", weeknum([Date]),
"年季度", year([date]) & "Q" & ROUNDUP(MONTH([Date])/3,0),
"年月", year([Date]) * 100 + MONTH([Date]),
"年周", year([Date]) * 100 + weeknum([Date]),
"星期几", WEEKDAY([Date])
)
第2步:建立关系

第3步:使用更简单的方法,避开LASTNONBLANK
因为1月31日在Sheet2中不存在,但是日期表是连续日期它有1月31日
所以:LASTDATE直接使用Sheet2表中的日期列
【度量值】平均值 = AVERAGE('Sheet2'[库存])
【度量值】期末库存 = CALCULATE([平均值],LASTDATE('Sheet2'[日期]))
我们使用一端日期表Date列筛选度量值,根据一端可以筛选多端的特性,不影响结果。

五、计算期初库存
既然我们期末库存使用了LastDate,期初库存同样可以使用FIRSTDATE
方法同上。
但是,在《火力全开》27.03我们讲了END与START系列函数,例如:
ENDOFMONTH(日期列) // 返回当月最后一天
STARTOFMONTH(日期列) // 返回当月第一天
其实,END与START系列和FIRSTDATE与LastDate系列都要注意使用日期表时,您月初那一天在多端表中是否存在的问题。
但是这两个系列最大的区别是:前者返回一天的,而后者返回每一天的。书中故意这样使用,目的就是让你看到二者区别。

第1步:新建日期表(略),并建立关系

第2步:度量值如下,使用多端表日期列,避开复杂原理,一端日期表仍然可以筛选多端表生成的度量值
【度量值】平均值 = AVERAGE('Sheet3'[库存])
【度量值】期初库存 = CALCULATE([平均值],STARTOFMONTH('Sheet3'[日期]) )
【度量值】期末库存 = CALCULATE([平均值],LASTDATE('Sheet3'[日期]))
【度量值】增长 = DIVIDE([期末库存]-[期初库存],[期初库存])


解读:以1月份为例,1月1日无库存,1月2日就是1月份的月初库存50,月末是31,所以下降了38%。同时,你也看到了END与START系列和FIRSTDATE与LastDate系列的区别。
怎么用?根据自己的需求来选择,您只想显示那一天,END与START系列,所有日期都需要显示FIRSTDATE与LastDate系列。
其实方法也不只这些,《火力全开》笔记27.05 OPENINGBALANCE系列 计算月初库存,所谓的月初库存就是上月底最后一天的库存。

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等