對于PowerBI使用者而言,經(jīng)常碰到的一個問題是,,想把度量值放到坐標(biāo)軸上,卻發(fā)現(xiàn)無法實(shí)現(xiàn),。尤其是初學(xué)者,,更是習(xí)慣性的想這么做。 PowerBI星球嘉賓天行,,摸索出了一個解決該問題的方法,,請慢慢品讀他的思路吧。 解決度量值不能作為坐標(biāo)軸字段的問題 作者:天行 初入Power BI的門,,很快就會被度量值和計算列的動態(tài)性吸引,,進(jìn)而義無反顧地跳進(jìn)DAX的火坑中,然后……(省略號的內(nèi)容留給曾經(jīng)在坑中和正在坑中徘徊的各位自行填寫吧??) 如何將度量值作為圖表的軸,,這是使用Power BI解決實(shí)際問題時繞不過去的“坑”之一,,而這個問題常常是由對某類數(shù)據(jù)進(jìn)行分類,然后需要對分類的情況進(jìn)行統(tǒng)計時產(chǎn)生的,。 正好星球中的米妮黃同學(xué)在群中提到一個關(guān)于課程學(xué)習(xí)動態(tài)評價的問題,,本文就借與她探討解決問題的示例,來一次性說清楚解決度量值作為圖表軸的字段思路原理,,方便大家舉一反三,,解決工作中類似的實(shí)際問題,。 一、示例描述 基本情況:一批人參加多門課程學(xué)習(xí),,評價是否通過的標(biāo)準(zhǔn)為學(xué)習(xí)課程的門數(shù),。 解決要求:評價標(biāo)準(zhǔn)是動態(tài)的,根據(jù)動態(tài)評價標(biāo)準(zhǔn)(學(xué)習(xí)課程門數(shù))評價每個人的學(xué)習(xí)狀態(tài),,并實(shí)時統(tǒng)計這一批人中不同學(xué)習(xí)狀態(tài)的人數(shù),。 建一個示例基礎(chǔ)數(shù)據(jù)表【data】 需求具體化:該表中有11人,通過課程從7門到24門不等,,根據(jù)動態(tài)評價標(biāo)準(zhǔn),,實(shí)時統(tǒng)計通過和未通過的人數(shù)。 二,、解決思路 (1)通過新增計算列的方式解決 1,、在【data】表中新增計算列【評價結(jié)果 計算列】 即設(shè)定通過標(biāo)準(zhǔn)為13,有8人顯示“完成學(xué)習(xí)”,,3人顯示“繼續(xù)努力” 2,、增加一個度量值【人數(shù)累計 評價標(biāo)準(zhǔn) 計算列】統(tǒng)計不同狀態(tài)的人數(shù) 人數(shù) 累計 評價標(biāo)準(zhǔn) 計算列 = COUNTROWS('data') 3、添加一個堆積柱形圖,,將【評價結(jié)果計算列】作為軸,,【人數(shù) 累計 評價標(biāo)準(zhǔn) 計算列】作為值,可以呈現(xiàn)“完成學(xué)習(xí)”和“繼續(xù)努力”的分類人數(shù)統(tǒng)計,。 4,、試圖解決動態(tài)評價問題:通過【新建參數(shù)】功能設(shè)定一個動態(tài)評價標(biāo)準(zhǔn)。 如上操作后,,將自動生成【通過標(biāo)準(zhǔn)】參數(shù)表和一個滑桿控件,,其中【通過標(biāo)準(zhǔn)】表包含【通過標(biāo)準(zhǔn)】字段和【通過標(biāo)準(zhǔn) 值】度量值。 5,、修改【評價標(biāo)準(zhǔn)計算列】公式為 評價結(jié)果 計算列 = IF([通過課程]>=[通過標(biāo)準(zhǔn) 值],"完成學(xué)習(xí)","繼續(xù)努力") 理論上應(yīng)該可以根據(jù)動態(tài)調(diào)整的評價標(biāo)準(zhǔn),,對每個人進(jìn)行重新評價。 結(jié)果發(fā)現(xiàn)盡管滑桿調(diào)整后,,【通過標(biāo)準(zhǔn) 值】隨之會發(fā)生正確變化,,但是【評價結(jié)果 計算列】的結(jié)果始終不變,進(jìn)一步研究會發(fā)現(xiàn)【評價結(jié)果 計算列】的判斷標(biāo)準(zhǔn)居然一直是10,,好詭異,! 至此,通過計算列解決動態(tài)評價的問題已宣告失敗,,具體原因后面再分析,。 (2)通過度量值的方式解決 1、新增【評價標(biāo)準(zhǔn)度量值】,與參數(shù)度量值綁定進(jìn)行是否通過判斷,。 評價標(biāo)準(zhǔn) 度量值 = VAR vMax=MAX('data'[通過課程]) Return IF(vMax>=[通過標(biāo)準(zhǔn) 值],"完成學(xué)習(xí)","繼續(xù)努力") 2,、新增堆積柱形圖,卻發(fā)現(xiàn)【評價標(biāo)準(zhǔn)度量值】無法拖放進(jìn)“軸”里,,似乎又進(jìn)入了死胡同,。 下面進(jìn)入本文的重點(diǎn),如何解決度量值不能用作圖表軸的問題,? 01 | 新建一個過渡表【標(biāo)準(zhǔn)】 02 | 新建三個度量值 03 | 將【標(biāo)準(zhǔn)】表中的【標(biāo)準(zhǔn)】字段拖入堆積柱形圖的"軸"中,,將【數(shù)量選擇】度量值放入堆積柱形圖的”值“中,可以呈現(xiàn)分類統(tǒng)計人數(shù)結(jié)果,。 04 | 再試著拖動滑桿動態(tài)調(diào)整評價標(biāo)準(zhǔn),,可以看到每個人的評價結(jié)果隨之變化,堆積柱形圖正確呈現(xiàn)每種分類人數(shù)的動態(tài)變化,。 至此,,我們另辟蹊徑解決了度量值不能用作圖表軸的問題。 三,、原理探討 在解決這個“小“問題的過程中,,實(shí)際上涉及到DAX的兩個核心問題:計算列的刷新原理和圖表的本質(zhì),下面我們結(jié)合這個示例來深入探究,。 (一)計算列為什么不能根據(jù)動態(tài)參數(shù)進(jìn)行刷新,? 在DAX的設(shè)計中,計算列是在數(shù)據(jù)裝載的過程中進(jìn)行計算刷新,,可以簡單理解為在點(diǎn)擊【主頁】菜單的【刷新】項(xiàng)時,,對所有表的數(shù)據(jù)進(jìn)行重新裝載,或者重新打開Power BI文件時,,計算列才會進(jìn)行計算,,其他時候計算列不會發(fā)生變化。 而度量值則是在計算上下文發(fā)生改變時,,就會實(shí)時進(jìn)行重新計算。 所以,,在本例中,,動態(tài)參數(shù)發(fā)生改變時,因?yàn)椤綿ata】表中每個人的學(xué)習(xí)課程數(shù)沒有變化,,所以【data】表中的計算列也不會重新計算,。 進(jìn)一步思考可以得出:計算列的原理是數(shù)據(jù)裝載時一次性計算,主要占用內(nèi)存資源,;度量值是隨著計算上下文的變化實(shí)時計算,,主要占用CPU資源。 再往深處推演:如果同樣的計算結(jié)果,表格中的行數(shù)越多,,添加的計算列占用的內(nèi)存將越多,,同時報表打開的速度也會因?yàn)榇罅康挠嬎懔杏嬎愣S之減慢。 最后可以收獲一條實(shí)際工作中的DAX使用原則:明細(xì)數(shù)據(jù)較多時,,為保證報表打開效率,,盡量使用度量值,而不要使用計算列,;如果需要實(shí)時調(diào)整參數(shù),,實(shí)時得出分析結(jié)果,則只能使用度量值,。 (二)圖表的軸到底是什么,?為什么度量值不能用作軸? 要理解圖表的軸是什么,,首先要理解圖表是什么,。 這一點(diǎn)可以通過PowerBI里面的實(shí)際操作來得出結(jié)論。 選擇堆積柱形圖,,進(jìn)行復(fù)制(Ctrl+C),、粘貼(Ctrl+V)操作,得到一個一模一樣的堆積柱形圖復(fù)制品,,選中“復(fù)制品“,,在【可視化】面板中切換為【表】,發(fā)現(xiàn)”復(fù)制品“轉(zhuǎn)換成了一個普通的二維表,。 從這個轉(zhuǎn)換中,,我們可以得出結(jié)論:PowerBI的圖表本質(zhì)就是表格(如果有興趣,可以將每種圖表都轉(zhuǎn)換一次,,看看結(jié)果是否一致),,圖表只是表格的一種表現(xiàn)形式。 那么為什么度量值不能當(dāng)作軸呢,?這個問題的答案同樣可以通過實(shí)際操作推演出來,。 新建一個表格,按照開始的思路,,把【評價標(biāo)準(zhǔn) 度量值】和【人數(shù) 累計 評價標(biāo)準(zhǔn) 計算列】放到“值“中,,得出兩個風(fēng)馬牛不相及的結(jié)果: 【評價標(biāo)準(zhǔn) 度量值】是根據(jù)沒有【姓名】篩選的情況下所有人課程的合計數(shù)去判斷是否通過,結(jié)果自然是"完成學(xué)習(xí)". 【人數(shù) 累計 評價標(biāo)準(zhǔn) 計算列】是沒有篩選上下文的的行計數(shù),,所以結(jié)果是11,。 這兩個結(jié)果雖然能夠放到一個表格里面,但毫無實(shí)際意義,,而圖表是要呈現(xiàn)一種數(shù)據(jù)之間邏輯關(guān)系的結(jié)果,,沒有邏輯關(guān)系的度量值當(dāng)然不能放到圖表的軸里了。 那么這個堆積柱形圖的意義應(yīng)該是什么呢? 我們從“復(fù)制品”轉(zhuǎn)換成功的表格中可以看到清晰的數(shù)據(jù)之間的邏輯關(guān)系:根據(jù)評價標(biāo)準(zhǔn)對數(shù)據(jù)進(jìn)行分組聚合運(yùn)算,,得出每種標(biāo)準(zhǔn)的實(shí)際人數(shù),。 由此,我們已經(jīng)推演出圖表的核心原理: 1,、圖表的本質(zhì)是表格 2,、由于圖表必須呈現(xiàn)數(shù)據(jù)間邏輯關(guān)系的意義,所以必須根據(jù)確定的標(biāo)準(zhǔn)(維度)對數(shù)據(jù)進(jìn)行分組,,然后進(jìn)行各種聚合運(yùn)算,,這也就是為什么度量值不能作為圖表的軸的根本原因。 既然已經(jīng)明了圖表的原理,,具體解決辦法就是雕蟲小技了,。 1、建立一個過渡表,,對應(yīng)每一種可能分類的類型,; 2、用過渡表的分類標(biāo)準(zhǔn)字段作為圖表中的軸字段(分組條件) 3,、針對每種分類構(gòu)建一個單獨(dú)計數(shù)的度量值(【數(shù)量繼續(xù)努力】和【數(shù)量 完成學(xué)習(xí)】) 4,、構(gòu)建【數(shù)量選擇】度量值,通過判斷篩選上下文的分類標(biāo)準(zhǔn),,調(diào)用對應(yīng)的單獨(dú)計數(shù)度量值,,作為圖表的值字段 這是一個解決DAX動態(tài)性的小套路,熟練掌握,,靈活運(yùn)用后可以解決很多具體問題,。 您掌握了嗎? 后記: 關(guān)于度量值不能作為圖表軸字段的問題,,曾經(jīng)被當(dāng)作PowerBI易用性遠(yuǎn)不如Tableau的證據(jù),,但是如果在理解了本文的推演原理,掌握了解決問題的套路之后,,再回頭看待這個所謂的“證據(jù)”,,應(yīng)該是PowerBI在易用性和靈活性之間的當(dāng)前取舍,所謂度量值可以當(dāng)軸字段的功能不過是一個過渡表小套路自動化的過程,,從最近PowerBI的演進(jìn)速度和方向來看,,也許就在某次月度更新中就會不經(jīng)意來到我們手邊,讓我們共同期待吧,。 |
|