PowerBI之DAX神功:第2卷第4回 不連續(xù)日期情況下計(jì)算移動(dòng)平均值
上節(jié)課我們提到,大多數(shù)情況是下面這樣不連續(xù)日期的銷售表,我只刪除了A商品2021/1/3的銷售記錄,咱們假設(shè)2021年1月3日這一天A商品沒人來買。

我們先使用上節(jié)課的度量值,測(cè)試一個(gè)問題:
【度量值】平均銷量 = AVERAGE('銷售表'[銷量])

我們以A商品為例,它沒有2021/1/3的銷售,所以這里就不顯示
【度量值】平均銷量 = AVERAGE('銷售表'[銷量])
這個(gè)度量值的篩選功能,大家應(yīng)該很熟悉
以前我們經(jīng)常用SUM,現(xiàn)在用AVERAGE,只是聚合方法不同,原理相同。
接下來我們回憶一下,上節(jié)課的【近3天移動(dòng)平均3】這個(gè)度量值:
【度量值】近3天移動(dòng)平均3 = CALCULATE([平均銷量],FILTER(all('日期表'),'日期表'[日期]>max('日期表'[日期])-3 && '日期表'[日期]<=MAX('日期表'[日期])))

計(jì)算過程:
1日,1/1=1
2日,(1+2)/2=1.5
3日,(1+2)/2=1.5??
?#因平均銷量根本就沒有第3日,所以第3日的移動(dòng)平均仍然是(1+2)/2=1.5??
4日,(2+4)/2=3? ? ?# 同理
5日,(4+5)/2=4.5? #同理
6日,(4+5+6)/3=5? ??
……………….以此類推
綜上所述,我們的度量值【近3天移動(dòng)平均3】當(dāng)平均銷量為空時(shí),這一天不記做分母
我們反過來說這句話:為什么沒有記錄的這一天不記做分母?
因?yàn)椋骸酒骄N量】在被日期篩選時(shí),就看不到這一天

有些人有業(yè)務(wù)需求,如本案例所示,他們需要將平均銷量為Blank()的看做是0
模擬計(jì)算過程:
1日,1/1=1
2日,(1+2)/2=1.5
3日,(1+2+0)/3=1?
4日,(2+0+4)/3=2?
5日,(0+4+5)/3=3?
6日,(4+5+6)/3=5??
……………..以此類推
思路:做一個(gè)類似【平均銷量】功能的度量值,需要體現(xiàn)出沒有銷售的那一天
小學(xué)2年級(jí)數(shù)學(xué)老師教的:任何數(shù)除以1等于原數(shù)
【度量值】總銷量 = sum('銷售表'[銷量])

【總銷量】這個(gè)度量值與我們剛才【平均銷量】是一樣的,A商品第3日無銷售就被過濾掉了
【度量值】日期表總行數(shù) = COUNTROWS('日期表')

上節(jié)課,我讓大家使用動(dòng)態(tài)方法創(chuàng)建日期表
你的日期表中,起止日期由銷售表日期列決定,且日期表中的日期必然連續(xù)。
無論你A商品第3日是否有銷量,都不會(huì)影響【日期表總行數(shù)】這個(gè)度量值
《DAX神功》 第1卷第4回.常見錯(cuò)誤與處理方法 我們講到如下概念
Blank() / 1 =Blank()
Blank()/Blank()=Blank()
經(jīng)過四則運(yùn)算后的blank()默認(rèn)是0
【度量值】輔助列后的銷量 = SUM('銷售表'[銷量])/COUNTROWS('日期表')

【度量值】近3天移動(dòng)平均6 = CALCULATE(sum('銷售表'[銷量])/COUNTROWS('日期表'),FILTER(all('日期表'),'日期表'[日期]>max('日期表'[日期])-3 && '日期表'[日期]<=MAX('日期表'[日期])))

學(xué)習(xí)知識(shí)和學(xué)習(xí)語言不同的地方,例如英語你知道正確發(fā)音就不用問為什么這么讀了?
但是知識(shí)不行,既然講原理,咱們就講到你休克為止。
大家想一想,如果我這樣寫:
【度量值】日期表總行數(shù)2 = COUNTROWS(Values('銷售表'[日期]))

是不是A商品第3日的被篩選沒了?
為什么?因?yàn)殇N售表中A商品沒有3日的銷售唄。
【度量值】近3天移動(dòng)平均7 = CALCULATE(sum('銷售表'[銷量])/COUNTROWS(Values('銷售表'[日期])),FILTER(all('日期表'),'日期表'[日期]>max('日期表'[日期])-3 && '日期表'[日期]<=MAX('日期表'[日期])))

看上去:是不是等價(jià)我們的【近3天移動(dòng)平均3】
你可能會(huì)想,如果你上來就這樣講,多簡(jiǎn)單,兩種分母情況就全部解決了
你看總計(jì)了嗎?我并不推薦這種方法
你這樣做處理起來很麻煩,如果想實(shí)現(xiàn)這種效果用【近3天移動(dòng)平均3】就好了

但是,度量值【近3天移動(dòng)平均6 】這種寫法,我們別無選擇
有兩種方法處理總計(jì)問題
方法一:讓總計(jì)為空:
【度量值】近3天移動(dòng)平均8 = if(Hasonevalue('日期表'[日期]),[近3天移動(dòng)平均6])

用在圖表上可以,用在矩陣上就奇怪了
方法二:讓明細(xì)行顯示[近3天移動(dòng)平均6],讓總計(jì)行顯示【近3天移動(dòng)平均3】
【度量值】近3天移動(dòng)平均3=CALCULATE([平均銷量],FILTER(all('日期表'),'日期表'[日期]>max('日期表'[日期])-3 && '日期表'[日期]<=MAX('日期表'[日期])))
【度量值】近3天移動(dòng)平均9 = if(Hasonevalue('日期表'[日期]),
[近3天移動(dòng)平均6],CALCULATE([平均銷量],FILTER(all('日期表'),'日期表'[日期]>max('日期表'[日期])-3 && '日期表'[日期]<=MAX('日期表'[日期]))))
Ps: 我將【近3天移動(dòng)平均3】寫到【近3天移動(dòng)平均9】里面,是告訴大家沒必要寫兩個(gè)度量值,擺在這里只是讓大家看清楚,IF的第3參數(shù)是什么。


各位聽眾,你們有沒有一種想哭的感覺?這剛哪到哪呀?最多就三分之一的教程。
為什么《孫興華講PowerBI火力全開》堅(jiān)持不講原理,你們明白嗎?
對(duì)于毫無基礎(chǔ)的人講原理,勸退率99.99%
對(duì)于有基礎(chǔ)的人講原理,勸退率85%以上。
原理,需要有強(qiáng)大的邏輯思維支撐,否則即便今日聽懂,也很難靈活運(yùn)用。

《孫興華講PowerBI火力全開》PowerBI必學(xué)課程
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辦公自動(dòng)化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110