Power BI之DAX神功:答网友问09 计算周期之间的差异
一、网友提问


二、指鹿为马

我看到你矩阵的行标题,就知道,这是「指鹿为马」造成的错误
下面这两个度量值是你提供的:
总金额 = SUM(销售表[金额])
同期 = CALCULATE([总金额],SAMEPERIODLASTYEAR('日期表'[Date]))
我从你的度量值中看到了两张表,一张销售表,一张日期表
从你提供的表格上可以看出销售表是多端,那日期表必然是一端。
你在日期表上找同期时间,在矩阵上用销售表筛选,必然不对呀!
我将矩阵上的行标题改成了日期表中的Date列就正确了:

如果,不建立日期表也是可以的。(日期表只是为了拥有更多颗粒度,如年月,星期等)
总金额 = SUM(销售表[金额])
同期 = CALCULATE([总金额],SAMEPERIODLASTYEAR('销售表'[日期]))
差异度量值保持不变

三、你说对就对呗
我一直说,权威书籍上举例只是说明一个特殊情况,并没有让你一定要那么做,你这样做的结果,总金额总计显示的是销售表中全部日期对应的金额,本期是396吗?不是!如果单算差异或增长率,可以!
你看看你的差异度量值:
差异 =
VAR x=[总金额]
VAR y=[同期]
return
IF(NOT ISBLANK(X) && NOT ISBLANK(Y),X-Y)
你要先判断,总金额和同期这两个度量值都不是空的时间才能相减,这不无端增加工作量吗?
除非你是外部筛选器使用切片器才有意义,意义在于动态。
难到我们同比看的不是今年与去年吗?领导会关心去年和前年对比吗,前年和大前年对比吗?
做分析,玩的不是技术,看的是业务,如无必要,不要炫技!
四、目的及我的做法
这种情况大多用于我们求同比、环比差异值与增长率
其实核心点就是两个度量值做减法
我做了一个和你一样的表格,表名Sheet1

第1步:动态日期表
日期表 = 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])
)
第2步:两表连线

第3步:建立度量值
总金额 = sum(Sheet1[金额])
本期 = CALCULATE([总金额],DATEADD('日期表'[Date], 0, YEAR ), '日期表'[年]=2021)
同期=CALCULATE([总销售],DATEADD('日期'[Date], -1, YEAR ))
差异=[本期]-[同期]
增长率 = DIVIDE([本期]-[同期],[同期])

《孙兴华讲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