Power BI之DAX神功:第2卷第11回 年初至今,季度初至今,月初至今
一、名词解释
YTD:当年累计,Year To Date的简写
QTD:当季度累计,Quarter To Date的简写
MTD:当月累计,Month To Date的简写
二、表函数 DATESYTD、DATESMTD、DATESQTD函数

【1】语法:年初至今
DATESYTD(日期,<上一年的截止日期>)
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"6-30")
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"2021/6/30")
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"2021-6-30")
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"2021年6月30日")
关于第2参数以上几种写法都对!返回一张表

当你省略第2参数时,第二参数默认是上一年的12月31日
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"2020/12/31")
【新建表】年初至今 = DATESYTD('Sheet1'[日期])
以上两个公式是等价的,返回一张表

Ps: 即便你写成
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"2021/12/31")
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"2021-12-31")
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"2021年12月31日")
也等价于
【新建表】年初至今 = DATESYTD('Sheet1'[日期],"12-31")
【新建表】年初至今 = DATESYTD('Sheet1'[日期])
仍然返回这张表:

上一年是什么,不看你第二参数显示的年份,而是由你表中最大日期所在的年决定的
第二参数中,DATESYTD函数只提取月份和日期。
【2】语法:月初至今与季初至今 (没有第2参数)
【新建表】月累计语法=DATESMTD(<日期>)
返回一张表

解释:年和月由原表中最大日期决定,这个函数只是返回指定年和月的第一天到最后一天。
【新建表】季度累计语法=DATESQTD(<日期>)
返回一张表

解释:年和月由原表中最大日期决定,这个函数只是返回指定年和季度的第一天到最后一天。
【3】优化上节课案例

第一步:新建动态日期表,并建议关系(略)
日期表 = ADDCOLUMNS(
CALENDAR(FIRSTDATE('Sheet1'[日期]),LASTDATE('Sheet1'[日期])),
"年", 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])
)
第二步:新建以下三个度量值
总销售 = sum(Sheet1[销售])
度量值3 = calculate([总销售],FILTER(all('日期表'),'日期表'[Date]<=max('日期表'[Date]) && '日期表'[年]=2021))
年初至今 = calculate([总销售],DATESYTD('日期表'[Date]))

因为你并没有指定是哪一年,它会对所有年每个月进行累积
年初至今 = calculate([总销售],DATESYTD('日期表'[Date]),'日期表'[年]=2021)
Ps: 上节课没有白听吧?

关于季度初至今和月初至今,我在这里就不在重复讲了。
《火力全开》笔记27课,向大家说过,这个函数是可以被替代的。
但是有一个更简单的TOTAL系列函数,可以代替 Calculate+DATESYTD这样的组合
三、值函数 TOTALYTD、TOTALMTD、TOTALQTD函数
【1】语法:年初至今=TOTALYTD(表达式或度量值,日期, 筛选器,上一年结束日期)
TOTAL年初至今 = TOTALYTD([总销售],'日期表'[Date],'日期表'[年]=2021)

【2】语法:月初至今=TOTALMTD(表达式或度量值,日期, 筛选器)
【3】语法:季初至今=TOTALQTD(表达式或度量值,日期, 筛选器)
四、回答网友问题
问:使用MTD和QTD时,在矩阵上行标题一定要用比更细的粒度显示吗?年>季度>月
答:老版本的PowerBI是这样,现在的版本已经解决这个问题了
【度量值】TOTAL月初至今1 = TOTALMTD([总销售],'日期表'[Date],'日期表'[年]=2021)
【度量值】TOTAL月初至今2 = CALCULATE([总销售],DATESMTD('日期表'[Date]),'日期表'[年]=2021)

如上图所示,查看2021年每个商品月初至今的数据,现在显示的是A和B商品都是2021/12/1至2021/12/31日的累积
由于你并没有指定是哪个月,所以行标题增加月份条件时,会显示所有月份月初至今

还是那句老话,不能死记硬背!你需要什么?就写成什么!
例如:你只需要看AB商品2021年12月的月初至今,那就再加个条件呗
TOTAL月初至今1 = TOTALMTD([总销售],'日期表'[Date],'日期表'[年]=2021 && '日期表'[月]=12)
TOTAL月初至今2 = CALCULATE([总销售],DATESMTD('日期表'[Date]),'日期表'[年]=2021,'日期表'[月]=12)

PS: 使用切片器也可以
五、DATES系列和TOTAL系列建议使用哪个?
我没有建议,《The Definitive Guide to DAX》推荐DATESYTD系列,而我本人使用DATES系列多一些,依个人喜好而定。

《孙兴华讲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等等
https://www.bilibili.com/read/cv10222110