1. 程式人生 > >Building Data Models with PowerPivot_進階篇

Building Data Models with PowerPivot_進階篇

Building Data Models with PowerPivot_進階篇


2.3 使用連結回標進行RFM分析
R Recent近度 MIN([近度]); [近度]=TODAY()-[下單日期]


3.1 使用高階DAX函式
高階聚合函式SUMX
SUMX函式比SUM函式高階的地方在於SUMX函式中可以巢狀使用篩選器函式
SUMX函式第一個引數是表格或者是返回表格資料的表示式,第二個引數是可嵌入篩選器函式的表示式


3.2 常用篩選器函式
可以用於表示式或新建表格中,篩選出指定資料,輸出相應表格
FILTER 按條件篩選資料
VALUES 返回列或者表去重後的結果
TOPN 返回前幾名的資料
ALL 強制計算所有資料
ALLEXCEPT 強制計算所有資料,排除函式中限定的某幾列
ALLNONBLANKROW 返回非空白的資料
ALL,ALLEXCEPT,ALLNONBLANKROW 通常巢狀於其他DAX函式中,比如CALCULATE函式等,主要用於限制資料篩選。
篩選器函式一般巢狀用在其他函式中


3.3 SUMX加FILTER實現無關係的資料獲取


'區域經理'中相同大區含有多個銷售經理,同大區的多個銷售經理應該有相同的銷售額。現在以[區域經理表]為主表,給其新增計算列,以顯示該經理的銷售額。
新建計算列 = SUMX(FILTER('銷售記錄','區域經理'[區域]=RELATED('省份區域'[區域])),'銷售記錄'[金額])


其中'區域經理'[區域]是主表的欄位,'區域經理'表和'省份區域' & '銷售記錄'兩張表沒有構建任何關係。
SUMX是迭代函式,在計算列中使用迭代函式會逐行計算相應結果。
本例中相當於SQL 中的子查詢。


3.4 Earlier函式 - DAX進階的里程碑


Earlier函式突破了DAX函式在行上面的限制
單表累積值的計算
新建計算列_累積值 = SUMX(FILTER('產品銷售表',EARLIER('產品銷售表'[銷售金額])<='產品銷售表'[銷售金額]),'產品銷售表'[銷售金額])
在上述公式中對主表每一行值計算過程中都會根據FILTER函式後的表引數生成一張虛擬表
FILTER函式篩選'產品銷售表'時,FILTER函式幫我們生成了一張虛擬的表格;EARLIER函式中的引數'產品銷售表'[銷售金額]代表了主表中的逐行獲取的數值,本例第二個'產品銷售表'[銷售金額]指代的是由FILTER函式建立的虛擬的表/欄位。


新建計算列_銷售總額 = SUMX(ALL('產品銷售表'),'產品銷售表'[銷售金額])


3.5 使用Earlier進行排名
新建計算列_排名 = COUNTROWS(FILTER('產品銷售表'EARLIER('產品銷售表'[銷售金額])<'產品銷售表'[銷售金額]))+1


3.6 使用Earlier區分新老使用者
新建計算列_使用者型別=IF(SUMX(FILTER('銷售記錄',EARLIER('銷售記錄'[客戶ID])='銷售記錄'[客戶ID]&&EARLIER('銷售記錄'[下單日期])>'銷售記錄'[下單日期]),'銷售記錄'[金額])>0,"老使用者","新使用者")


GENERATE(VALUES('使用者流量記錄'[姓名]),VALUES('日期表'[月份])) 可以替代掉summarise函式,寫法更簡潔易懂


4.1 篩選上下文 & 行上下文
context 語境,環境,上下文
***SUM之類的函式只能用於篩選上下文語境中,不能作為計算列使用


4.2 使用FILTER和ALL進行上下文互動
ALL會忽略篩選上下文
FILTER會保持篩選上下文


例子
MEASURE 銷售額 = SUM([金額]) //會隨著篩選器省份等值的變化而變化
MEASURE 公路自行車銷售額 = SUMX(FILTER('銷售記錄','銷售記錄'[產品名稱]="公路自行車"),'銷售記錄'[金額])
MEASURE 公路自行車銷售額佔比 = DIVIDE([公路自行車銷售額],[銷售額])


MEASURE 公路自行車銷售額CAL = CALCULATE([銷售額],'銷售記錄'[產品名稱]="公路自行車")


注1:FILTER篩選函式中內嵌的過濾條件屬於行上下文,該函式依然受篩選上下文的影響。
注2:CALCULATE函式內包含過濾條件,當外部篩選上下文作用的欄位與該函式內過濾條件設定的欄位重合時,CALCULATE函式採納函式內設定的過濾條件而忽略該篩選上下文。


4.3 使用CALCULATE進行上下文轉換
當我們不需要某一特殊列根據'產品分類'進行篩選時,可以使用CALCULATE+ALL['產品分類']組合
CAL = CALCULATE([銷售額],ALL['產品分類'])
該方式適用於計算相應分類 '產品分類' 佔總額的比重