国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
度量值、計(jì)算列和查詢的區(qū)別
編寫 DAX 有三種場(chǎng)景:度量值、計(jì)算列和查詢?,F(xiàn)在你需要學(xué)習(xí) DAX 中非常重要的一個(gè)概念:計(jì)算列和度量值的區(qū)別。盡管它們乍一看很相似,因?yàn)槟承┣闆r下你可以用兩種方式得到相同的結(jié)果,但實(shí)際上它們存在顯著的區(qū)別,理解這種區(qū)別是解鎖 DAX 能力的關(guān)鍵之一。
計(jì)算列
例如,如果你想在 Excel 中創(chuàng)建一個(gè)計(jì)算列,你可以簡(jiǎn)單地移動(dòng)到表的最后一列,即添加列,然后開始編寫公式。其他工具可能有不同的用戶界面,但操作類似。
在 Power Pivot 中創(chuàng)建計(jì)算列
計(jì)算列與表中的任何其他列一樣,你可以在數(shù)據(jù)透視表或其他報(bào)表的行、列、篩選器或值中使用它。如果需要,還可以使用計(jì)算列來定義關(guān)系。定義計(jì)算列的 DAX 表達(dá)式在它所屬表的當(dāng)前行上下文中計(jì)值。任何對(duì)列的引用都會(huì)返回當(dāng)前行中該列的值,你不能直接訪問其他行的值。
后面你將看到,聚合函數(shù)可以為整張表聚合列值。想要獲取行子集的值,唯一方法是使用可以返回表的 DAX 函數(shù),然后對(duì)其進(jìn)行操作。通過這種方式,你可以為特定范圍的行聚合列值,并可以通過過濾僅由一行組成的表格來操作不同的行。在關(guān)于計(jì)值上下文的文章中,你將繼續(xù)了解這部分內(nèi)容。
關(guān)于計(jì)算列,需要記住的一個(gè)重要概念是,它在內(nèi)存數(shù)據(jù)庫(kù)刷新時(shí)計(jì)算,然后存儲(chǔ)在模型中,報(bào)表中的篩選器無法影響它的計(jì)算過程。如果你習(xí)慣于 SQL 的計(jì)算列(非持久化的)可能會(huì)覺得有些奇怪,因?yàn)楹笳咴诓樵儠r(shí)計(jì)算,只在計(jì)算時(shí)消耗內(nèi)存,計(jì)算完成后釋放。然而,在表格模型中,所有計(jì)算列常駐內(nèi)存,并在表刷新時(shí)才進(jìn)行計(jì)算
當(dāng)你創(chuàng)建非常復(fù)雜的計(jì)算列時(shí),了解這種行為是有幫助的。計(jì)算列占用模型加載的時(shí)間而不是查詢時(shí)間,以獲得更好的用戶體驗(yàn)。不過,你必須始終記住,計(jì)算列使用的是電腦的內(nèi)存(通常是有限的)。例如,如果計(jì)算列使用了一個(gè)復(fù)雜的公式,你可能會(huì)嘗試將計(jì)算步驟分離到不同的中間列中。雖然這種技術(shù)在項(xiàng)目開發(fā)中很有用,但在實(shí)際應(yīng)用的時(shí)候不是一個(gè)好習(xí)慣,因?yàn)槊總€(gè)中間計(jì)算都存儲(chǔ)在 RAM 中,占用了較多的內(nèi)存。
度量值
在 DAX 模型中還有一種定義計(jì)算的方法,當(dāng)你不想沿著表格逐行計(jì)算,而是想在上下文環(huán)境中對(duì)表的多行進(jìn)行聚合計(jì)算時(shí),這種方法非常有用。我們稱這些計(jì)算為度量值。
度量值使用的表達(dá)式通常利用聚合函數(shù)(如SUM、MIN、MAX、AVERAGE 等)生成標(biāo)量結(jié)果,并且結(jié)果永遠(yuǎn)不會(huì)存儲(chǔ)在模型中。 度量值的使用非常廣泛,從簡(jiǎn)單的列聚合到更復(fù)雜的公式(覆蓋篩選上下文和/或關(guān)系傳播的公式)應(yīng)有盡有。
例如:你可以在銷售表中定義名為 GrossMargin 的列來計(jì)算毛利:
Sales[GrossMargin] = Sales[SalesAmount] – Sales[TotalProductCost]
但如果你想顯示毛利占銷售額的百分比會(huì)怎樣呢?你可以使用以下公式創(chuàng)建一個(gè)計(jì)算列:
Sales[GrossMarginPct] = Sales[GrossMargin] / Sales[SalesAmount]
正如你在下圖中看到的,公式在行級(jí)別的計(jì)算結(jié)果是正確的
GrossMarginPct 列以百分比顯示毛利率,逐行計(jì)算
然而,當(dāng)你計(jì)算某個(gè)百分比的總值時(shí),你不能依賴于計(jì)算列。實(shí)際上,你需要用毛利之和除以銷售額之和。因此,在這種情況下,需要基于聚合的結(jié)果計(jì)算比率;而不能直接使用計(jì)算列的加總。換句話說,你計(jì)算的是和的比率,而不是比率的和。計(jì)算 GrossMarginPct 的正確的方式是使用度量值:
GrossMarginPct:=SUM ( Sales[GrossMargin] ) / SUM (Sales[SalesAmount] )
然而,正如我們已經(jīng)說過的,你不能將其輸入到計(jì)算列中。如果操作的對(duì)象是聚合值而不是逐行,則必須創(chuàng)建度量值。
在 Excel 中我們使用“:=”來定義一個(gè)度量值,而不是等號(hào)(=),以便更容易區(qū)分代碼中的度量值和列。而在 Power BI Desktop 創(chuàng)建度量值和計(jì)算列都可以直接輸入“=”開始
度量值和計(jì)算列都使用 DAX 表達(dá)式;區(qū)別在于計(jì)值上下文。度量值是在透視表或報(bào)表所在的上下文環(huán)境中計(jì)算的,而計(jì)算列是在它所在表的行級(jí)別計(jì)算的。單元格的篩選上下文取決于用戶對(duì)透視表的選擇或者 DAX 查詢的形態(tài)。因此,當(dāng)你在度量值中使用SUM(Sales[SalesAmount])時(shí),公式將在該單元格的上下文環(huán)境中計(jì)算 SalesAmount 列的總和,而當(dāng)你在計(jì)算列中使用 Sales[SalesAmount]時(shí),指的是 SalesAmount 列在當(dāng)前行的值。
以散點(diǎn)圖為例,報(bào)表層度量值的計(jì)值環(huán)境
度量值需要定義在表中,這是 DAX 語言的要求之一。然而,度量值并不真正屬于任何表。事實(shí)上,你可以將度量值從一個(gè)表移動(dòng)到另一個(gè)表,而不影響正常使用,比如你在 Power BI Desktop 中選擇任意度量值,在建模選項(xiàng)卡下可以切換它所在的表。
雖然度量值和列在書寫的時(shí)候?qū)κ欠裉砑颖砻o強(qiáng)制要求,但從易用性出發(fā),強(qiáng)烈建議你只在列引用的時(shí)候添加表名,度量值則無需添加表名,這會(huì)減少代碼閱讀時(shí)的歧義。
自動(dòng)生成的度量值
除了手動(dòng)編寫度量值,還有一種方法可以自動(dòng)創(chuàng)建度量值,任何列(我們通常使用數(shù)值列)都可以通過報(bào)表視覺對(duì)象或問答進(jìn)行匯總。 這是 DAX 為模型開發(fā)者提供的便利,讓你在很多情況下都無需創(chuàng)建度量值。 例如,將銷售額列拖入圖表后可以選擇多種匯總方式(包括SUM、COUNTAVERAGE、MEDIAN、MIN、MAX 等),無需為每種聚合類型手動(dòng)創(chuàng)建度量值。但是如果你需要在后續(xù)計(jì)算中引用它們,就必須手動(dòng)創(chuàng)建。
為自動(dòng)創(chuàng)建的度量值選擇聚合方式
快速度量值
Power BI Desktop 提供一種無需書寫代碼,快速創(chuàng)建常用甚至復(fù)雜度量值的功能,官方是這樣介紹快速度量值的:
可使用快速度量 快速、輕松地執(zhí)行常見的高效計(jì)算。 快速度量 根據(jù)你在對(duì)話框中輸入的內(nèi)容,在后臺(tái)運(yùn)行一組 DAX 命令(有現(xiàn)成的 DAX,無需編寫),然后顯示結(jié)果以供你在報(bào)表中使用。 最重要的是,可以查看快速度量執(zhí)行的 DAX,從而開始學(xué)習(xí)或拓展你自己的 DAX 知識(shí)…
快速度量值列表
快速度量值創(chuàng)建非常方便,可以在一些簡(jiǎn)單的模型和邏輯下使用,但隨著你的數(shù)據(jù)量和模型結(jié)構(gòu)復(fù)雜性的增加,快速度量可能帶來計(jì)算性能甚至邏輯上的隱患。原因是 DAX 是一種非常靈活的語言,你必須結(jié)合具體的業(yè)務(wù)邏輯和模型結(jié)構(gòu)才能寫出高效的公式,在這一點(diǎn),程序還無法勝過人腦。關(guān)于快速度量,我的建議是盡量不要使用它。
計(jì)算列和度量值的區(qū)別
雖然看起來相似,但兩者其實(shí)有顯著不同,計(jì)算列在模型刷新時(shí)計(jì)算并使用當(dāng)前行作為上下文;用戶對(duì)透視表的操作不會(huì)影響計(jì)算列。而度量值在當(dāng)前上下文環(huán)境定義的數(shù)據(jù)集合上進(jìn)行操作。例如,在數(shù)據(jù)透視表中,源表基于單元格的坐標(biāo)被篩選,并使用這些篩選條件聚合和計(jì)算結(jié)果。換句話說,度量值總是在計(jì)值上下文中對(duì)聚合的數(shù)據(jù)進(jìn)行操作,其默認(rèn)的執(zhí)行模式不引用任何一行。
正確選擇計(jì)算列和度量值
現(xiàn)在你已經(jīng)了解了計(jì)算列和度量值之間的區(qū)別,接下來你可能想知道兩者如何選擇。其實(shí)兩者有時(shí)可以通用,但在大多數(shù)情況下,計(jì)算需求決定了最后的選擇。
當(dāng)你想要執(zhí)行以下操作時(shí),你必須定義一個(gè)計(jì)算列:
需要將計(jì)算結(jié)果置于 Excel 切片器;透視表行區(qū)域、列區(qū)域(而不是值區(qū)域);作為 DAX 查詢的篩選條件。
定義嚴(yán)格綁定到當(dāng)前行的表達(dá)式。(例如,計(jì)算Price * Quantity 時(shí)不能對(duì)兩列求和或求平均后再相乘)
對(duì)文本或數(shù)值做分類時(shí)。(例如,度量值的范圍,客戶的年齡范圍:比如 0-18,18-25 等等)。
然而,當(dāng)你想在由用戶設(shè)定篩選條件的數(shù)據(jù)透視表值區(qū)域中看到計(jì)算結(jié)果時(shí),你必須定義一個(gè)度量值,例如:
基于透視表的選擇計(jì)算利潤(rùn)率百分比。
存在年份和地區(qū)篩選器的情況下,計(jì)算一個(gè)產(chǎn)品占所有產(chǎn)品的比率。
你可以使用計(jì)算列和度量值來表示同一計(jì)算,即使在這種情況下需要使用不同的 DAX 表達(dá)式。例如,你可以將 GrossMargin 定義為一個(gè)計(jì)算列:
Sales[GrossMargin] = Sales[SalesAmount] - Sales[TotalProductCost]
也可以定義成度量值
GrossMargin:= SUM ( Sales[SalesAmount] ) – SUM( Sales[TotalProductCost])
在這種情況下,我們建議你使用度量值,因?yàn)槠湓诓樵儠r(shí)進(jìn)行計(jì)算,這種方式對(duì)模型文件的大小幾乎不會(huì)有任何影響,這在大型數(shù)據(jù)集中非常重要。
不過,當(dāng)模型大小不是問題時(shí),不必糾結(jié)于哪一種方法,你可以使用自己更熟悉的方式,不必矯枉過正。
交叉引用
顯然,度量值可以引用一個(gè)或多個(gè)計(jì)算列。反之亦然,但可能就不那么直觀了,計(jì)算列可以引用度量值:通過這種方式,度量值在當(dāng)前行定義的上下文中計(jì)算。這個(gè)操作將度量值轉(zhuǎn)換并固化到一個(gè)列中,列不會(huì)受到用戶操作的影響。顯然,只有特定的操作才能產(chǎn)生有意義的結(jié)果,因?yàn)橥ǔR粋€(gè)度量值的計(jì)算很大程度上依賴于用戶在數(shù)據(jù)透視表中所做的選擇。
查詢
編寫查詢也是 DAX 的常用功能之一,與度量值和計(jì)算列不同的是,查詢返回表結(jié)構(gòu)的數(shù)據(jù),而不是標(biāo)量值。DAX 查詢編寫起來與 SQL 類似,SQL 是一種聲明式語言。通過使用 SELECT 語句聲明要檢索的數(shù)據(jù)集來定義所需的內(nèi)容,而不必考慮引擎如何運(yùn)作和檢索信息。而 DAX 則是一種函數(shù)式語言。在 DAX 中,每個(gè)表達(dá)式都是一個(gè)函數(shù)調(diào)用,而函數(shù)的參數(shù)可以依次被其他函數(shù)調(diào)用。對(duì)參數(shù)的計(jì)算可能導(dǎo)致 DAX 執(zhí)行非常復(fù)雜的查詢計(jì)劃。
例如,如果你只想檢索住在歐洲的客戶,你可以用 SQL 編寫:
SELECT
Customers.CustomerName,
SUM ( Sales.SalesAmount ) AS SumOfSales
FROM Sales
LEFT JOIN Customers
ON Sales.CustomerKey = Customers.CustomerKey
WHERE
Customers.Continent = 'Europe' GROUP BY
Customers.CustomerName
使用 DAX,你不需要在查詢中聲明 WHERE 條件,相對(duì)應(yīng)的,DAX 用特定的函數(shù)(FILTER)來篩選結(jié)果:
EVALUATE
SUMMARIZE (
FILTER ( Customers, Customers[Continent] = "Europe" ),
Customers[CustomerName],
"SumOfSales", SUM ( Sales[SalesAmount] )
)
可以看出,FILTER 是這樣一個(gè)函數(shù):它只返回住在歐洲的客戶,查詢得到了預(yù)期的結(jié)果。函數(shù)嵌套的順序和函數(shù)的類型對(duì)最終結(jié)果以及引擎的性能都有很大的影響。在 SQL 中也是這樣,即便你相信查詢優(yōu)化器可以找到最優(yōu)的查詢計(jì)劃。在 DAX 中,雖然查詢優(yōu)化器做的也很好,但代碼的編寫者不能據(jù)此掉以輕心,仍要以寫出運(yùn)行良好的代碼為責(zé)任。
示例內(nèi)容 EVALUATE 是用于聲明查詢的函數(shù),在基礎(chǔ)表函數(shù)中會(huì)詳細(xì)介紹
編寫查詢最常用的工具是DAX Studio,你可以用它連接 Power Pivot,Power BI Desktop 和 SSAS 表格模型進(jìn)行語句的調(diào)試和編寫,DAX Studio 是 DAX 開發(fā)人員的必備工具,訪問前面給出的鏈接可以了解它的使用方法。
DAX Studio 界面
除此之外,你也可以在 Excel 和 Power BI 中直接運(yùn)行查詢。
在 Excel 中編寫 DAX 查詢
Excel 不能像 Power BI Desktop 那樣直接在模型中新建表,不過你可以使用一種叫鏈接回表的方法來解決這個(gè)問題,鏈接回表的操作步驟和限制比較多,建議只在必須借助 DAX 才能完成計(jì)算的情況下使用。
創(chuàng)建鏈接回表的步驟
注意事項(xiàng):
鏈接回表必須在 Excel 工作簿中暫存,所以數(shù)據(jù)量上限 100 萬行
導(dǎo)出時(shí)可以選擇一個(gè)數(shù)據(jù)量較少的表,減少導(dǎo)出消耗的時(shí)間
第 4 步中選擇的表是由 PQ 導(dǎo)入的查詢表,從表格直接導(dǎo)入模型的表無法作為鏈接回表
鏈接回表操作繁瑣,不是一種優(yōu)雅的解決方案,是一種為了解決新建表問題不得已而為之的策略
在 Power BI Desktop 中編寫 DAX 查詢
通過建模選項(xiàng)卡 – 新建表,將查詢結(jié)果生成一張表。此功能不需要使用 EVALUATE 聲明查詢,這是它和另外兩種方式的區(qū)別。
在 Power BI Desktop 中使用查詢
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
FILTER 函數(shù) (DAX)
【DAX圣經(jīng)】第四章:理解計(jì)算上下文(1)
Power BI Desktop 中的 DAX 基本概念
超級(jí)透視表和Power BI:深入理解行上下文
PowerBI開發(fā) 第四篇:DAX表達(dá)式
DAX查詢進(jìn)階:駕駛DAX Studio
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服