Power BI之DAX神功:第2卷第13回 計算平移后的周期PARALLELPERIOD詳解
關于PARALLELPERIOD函數(shù)我們在《火力全開》中已經(jīng)詳細介紹過了,距《火力全開》殺青已經(jīng)過去10個月了,今天我們對網(wǎng)友遇到的問題綜合解決一下。
一、PARALLELPERIOD與DATEADD的區(qū)別

1.既然都是表函數(shù),我們先放到新建表中查看
【新建表】表1 = DATEADD('Sheet1'[日期],-1,YEAR)

【新建表】表2 = PARALLELPERIOD('Sheet1'[日期],-1,YEAR)

兩個函數(shù)參數(shù)作用是相同的,只是函數(shù)功能不同!同樣是向左平移一年:

2.DATEADD函數(shù)工作流程:
(1)Sheet1中最大日期是2021/3/1
(2)取向左平移一年,且日期小于等于2020/3/1的數(shù)據(jù)
3.PARALLELPERIOD函數(shù)工作流程:
(1)Sheet1中最大日期是2021/3/1,獲取最大年份是2021年
(2)取向左平移一年,且日期小于2021/1/1的數(shù)據(jù)
4.我們寫度量值,放到矩陣中觀察
【度量值】總銷售 = sum(Sheet1[銷售])?
// 每個日期對應的值
【度量值】D = CALCULATE([總銷售],DATEADD('Sheet1'[日期],-1,YEAR))?
// 每個日期對應的同比日期值,例如2019年1月1日對應2018年1月1日
【度量值】S = CALCULATE([總銷售],PARALLELPERIOD('Sheet1'[日期],-1,year))
// 每個日期所在年對應的同比年總和的值,例如2019年1月1日,對應2018年全年總和100

5.回答網(wǎng)友問題

答:第1個問題,用哪個日期是您的業(yè)務知識,我不懂您的業(yè)務,所以我不知道用哪個日期
打個比方:大家都知道常用的3個緊急電話110,119,120,這三個電話在中國都管什么的,我不解釋了,但是當我到達美國以后,撥打這3個電話沒用了,美國有相對應的電話,在美國我問任何一個人:“你們這里叫救護車打什么電話?” 他們應該知道。
在國內,就好比是您自己的業(yè)務。現(xiàn)在您對非同事以外的人講,就相當于出國了,所以自己的號碼與他國不互通,需要使用共同語言,120并不通用,通用的是救護車。
回答第2個問題,本年度平均值和上年度平均值,您的公式我沒看懂,我們重新來看案例:
我以年為例 ,如果是月或季度,請修改相應的英文。
通用語言案例如下,以下兩張表,通過商品編碼一對多連線


我故意寫出每一個步驟,方便大家觀看:
【度量值】總銷售 = sumx('銷售表','銷售表'[銷量]*RELATED('商品表'[售價]))?
【度量值】本年合計 = TOTALYTD([總銷售],PARALLELPERIOD('銷售表'[日期],0,YEAR))
【度量值】每年天數(shù) = TOTALYTD(COUNTROWS(DISTINCT('銷售表'[日期])),PARALLELPERIOD('銷售表'[日期],0,YEAR))
【度量值】每年平均 = [本年合計]/[每年天數(shù)]

以上我們求的是本年均價,修改以下兩個度量值
【度量值】本年合計 = TOTALYTD([總銷售],PARALLELPERIOD('銷售表'[日期],0,YEAR))
【度量值】每年天數(shù) = TOTALYTD(COUNTROWS(DISTINCT('銷售表'[日期])),PARALLELPERIOD('銷售表'[日期],0,YEAR))
因為本年是不平移,就是0,去年就是平移,-1
【度量值】去年合計 = TOTALYTD([總銷售],PARALLELPERIOD('銷售表'[日期],-1,YEAR))
【度量值】每年天數(shù) = TOTALYTD(COUNTROWS(DISTINCT('銷售表'[日期])),PARALLELPERIOD('銷售表'[日期],-1,YEAR))

二、PARALLELPERIOD與上一個/下一個的區(qū)別
《火力全開》筆記27課04,我們講過NEXT(下一個)系列和PREVIOUS(上一個)系列函數(shù)
《火力全開》中我們使用Next進行的舉例,現(xiàn)在我們用PREVIOUS舉例
為了清晰的表達,我們使用一張新表格:

步驟如下:
【1】做動態(tài)日期表(為了獲得更多顆粒度)
日期表 = 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】做以下度量值
總銷售 = sum(Sheet1[銷售])?
A = calculate([總銷售],PARALLELPERIOD('日期表'[Date],-1,YEAR))
B = calculate([總銷售],PREVIOUSYEAR('日期表'[Date]))?
【3】矩陣中行標題放:日期表中的年季度

你會發(fā)現(xiàn),PARALLELPERIOD和PREVIOUSYEAR結果是一樣的,2021年的上一年只有一個季度返回上一年的總銷售36524,只是后者不帶總計。
【4】為了理解這個問題,我們將公式修改為上個月:
A = calculate([總銷售],PARALLELPERIOD('日期表'[Date],-1,Month))
B = calculate([總銷售],PREVIOUSMonth('日期表'[Date]))?
現(xiàn)在,我們將行標題修改為:日期表中的Date列

主要的區(qū)別就在小計和總計上面,我們觀察小計

以2021年第2季度為例,PREVIOUSMONTH顯示上個月的也就是2021年3月的19778
而PARALLELPERIOD顯示本季度平移一個月后 2021.3、2021.4、2021.5三個月的總和

我們再觀察年小計:

以2021年為例,PREVIOUSMONTH顯示上個月的也就是2020年12月的14198
而PARALLELPERIOD顯示本年平移一個月的總和,2020.12~2021.6的總和。135468=148612-27342+14198
所以,PREVIOUSMONTH不能有總計,它返回的都是上一個月的值。

《孫興華講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函數(shù))、PowerQuery(M函數(shù))、Python辦公自動化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110