DAX 公式中的內容
內容可以讓您執行動態分析,在這類分析中,公式的結果能夠變更以反映目前的資料列或資料格選擇以及任何相關的資料。 了解內容並有效地使用內容對於建立高效能的動態分析及排除公式內的問題而言將會非常關鍵。
本節定義三種不同類型的內容:「資料列內容」(Row Context)、「查詢內容」(Query Context) 及「篩選內容」(Filter Context)。 此外,也將說明如何針對導出資料行及樞紐分析表中的公式來評估內容。
本節最後一部分會提供詳細範例的連結,這些範例將示範公式的結果如何根據內容而變更。
內容的簡介
PowerPivot 中的公式可能會受幾項因素影響,包括樞紐分析表中套用的篩選、資料表之間的關聯性,以及公式中使用的篩選。 「內容」(Context) 是實現「動態分析」(Dynamic Analysis) 的要素。了解內容對於公式的建置與疑難排解相當重要。
內容可分為以下不同類型:「資料列內容」(Row Context)、「查詢內容」(Query Context) 和「篩選內容」(Filter Context)。
「資料列內容」(Row Context) 可以視為「目前的資料列」。如果您已經建立導出資料行,資料列內容就是由每個個別資料列中的值,以及資料行中與目前資料列相關的值所組成。 也有一些函數 (EARLIER 和 EARLIEST) 可以從目前的資料列取得值,然後在整個資料表上執行運算時使用該值。
「查詢內容」(Query Context) 指的是資料的子集,系統會根據資料列和資料行標頭,為樞紐分析表中的每個資料格隱含地建立這個資料。
「篩選內容」(Filter Context) 是根據套用到資料列,或由公式中的篩選運算式所定義之篩選條件約束,在每個資料行中所允許的一組值。
下列主題會詳細說明不同類型的內容:DAX 公式中的內容。
回到頁首
資料列內容
如果您已經在導出資料行中建立公式,該公式的「資料列內容」(Row Context) 就會包含目前資料列中所有資料行的值。 如果資料表與另一個資料表相關,則內容也會包含後者中與目前資料列相關的所有值。
例如,假設您建立導出資料行 =[Freight] + [Tax],將相同資料表中的兩個資料行相加。 這個公式的行為就像 Excel 資料表中的公式,會自動參考相同資料列的值。 請注意,資料表與範圍不同:您無法使用範圍標記法參考目前資料列之前的值,而且也無法參考資料表或資料格中的任意單一值。 您必須一律使用資料表和資料行。
資料列內容會自動追隨資料表之間的關聯性,以判斷相關資料表中哪些資料列與目前資料列相關聯。
例如,下列公式會根據訂單的運送區域,使用 RELATED 函數來提取相關資料表中的稅額值。 稅額值的決定方式是使用目前資料表中的區域值,在相關資料表中查閱該區域,然後從相關資料表取得該區域的稅率。
= [Freight] + RELATED('Region'[TaxRate])
此公式直接從 Region 資料表中取得目前區域的稅率。 您不需要知道或指定連接不同資料表的索引鍵。
多個資料列內容
此外,DAX 也包含會反覆對資料表進行計算的函數。 這些函數可以有多個目前資料列及目前資料列內容。 以程式設計術語來說,您可以建立不斷遞迴內部和外部迴圈的公式。
例如,假設您的活頁簿中包含一個 Products 資料表和一個 Sales 資料表。 您可能會想查看整個 Sales 資料表 (其中都是與多項產品相關的交易),然後在其中找到任何一次交易中每項產品的最大訂購數量。
在 Excel 中,這種計算需要一系列中繼摘要,如果資料變更,這些摘要都必須重建。 如果您是 Excel 的進階使用者,也許能夠建立陣列公式執行這項重建工作。 或者,您可以在關聯式資料庫中撰寫巢狀子選擇。
但是使用 DAX 時,您可以建立單一公式就傳回正確的值,而且如果加入資料至資料表,公式結果還會隨時自動更新。
=MAXX(FILTER(Sales,[ProdKey]=EARLIER([ProdKey])),Sales[OrderQty])
如需此公式的詳細逐步解說,請參閱<EARLIER 函數>。
簡單地說,EARLIER 函數可儲存目前運算前之運算中的資料列內容。 函數隨時都會在記憶體中儲存兩組內容:一組內容代表公式內部迴圈的目前資料列,另一組內容代表公式外部迴圈的目前資料列。 DAX 會自動在兩個迴圈之間選取饋入值,讓您能夠建立複雜的彙總。
查詢內容
「查詢內容」(Query Context) 指的是以隱含方式針對公式擷取之資料的子集。 當您將量值或其他值欄位放入樞紐分析表中的資料格時,PowerPivot 引擎會檢查資料列和資料行標頭、交叉分析篩選器和報表篩選,以判斷內容。 然後,PowerPivot 會進行必要的計算,以便填入樞紐分析表中的每個資料格。 所擷取的資料集就是每個資料格的查詢內容。
由於內容可以依您放置公式的位置而變更,公式的結果也會視您將公式用在具有許多群組和篩選的樞紐分析表中,或是用在沒有篩選只有最低限度內容的導出資料行中而變更。
例如,假設您建立簡單的公式,可加總 Sales 資料表中 Profit 資料行內的值:=SUM('Sales'[Profit])。 如果您在 Sales 資料表之中的導出資料行內使用這個公式,整個資料表的公式結果都是一樣的,因為公式的查詢內容一律都是 Sales 資料表的整個資料集。 您的結果會包含所有區域、所有產品、所有年度等等的利潤。
但是,您通常不會想要重複查看相同的結果,而會想取得特定年度、特定國家/地區、特定產品,或某些上述各項組合的利潤,然後取得總計。
在樞紐分析表中,透過加入或移除資料行和資料列標頭,以及加入或移除交叉分析篩選器,很容易就能變更內容。 您可以在量值中建立類似上述的公式,然後拖放到樞紐分析表之中。 只要將資料行或資料列標題加入樞紐分析表中,就會變更評估量值的查詢內容。 配量和篩選作業也會影響內容。 因此,用於樞紐分析表中的同一個公式會以不同的「查詢內容」(Query Context) 為每個資料格進行評估。
篩選內容
當您使用公式的引數來指定資料行或資料表內允許之值組的篩選條件約束時,就會加入「篩選內容」(Filter Context)。 篩選內容會套用到其他內容 (如資料列內容或查詢內容) 之上。
例如,樞紐分析表會根據資料列和資料行標題,計算每個資料格的值,如上文中有關查詢內容的小節中所述。 但是在您加入至樞紐分析表的量值或導出資料行之中,您可以指定篩選運算式來控制公式所使用的值。 您也可以在特定資料行上選擇性地清除篩選。
如需有關如何在公式中建立篩選的詳細資訊,請參閱<FILTER 函數>。
如需如何清除篩選以建立總計的範例,請參閱<ALL 函數>。
如需有關如何在公式中選擇性地清除及套用篩選的範例,請參閱<ALLEXCEPT 函數>。
因此,您必須檢閱樞紐分析表內所使用之量值或公式的定義,以便在解譯公式的結果時,知道篩選內容為何。
決定公式內的內容
當您建立公式時,PowerPivot for Excel 會先檢查一般語法,然後檢查您針對目前內容中可能的資料行和資料表所提供之資料行和資料表的名稱。 如果 PowerPivot 找不到公式所指定的資料行和資料表,您就會接到錯誤訊息。
如前幾節中所述,內容是使用活頁簿中可用的資料表、資料表之間的任何關聯性,以及已套用的任何篩選來決定。
例如,如果您剛將一些資料匯入新資料表中,而尚未套用任何篩選,則資料表中的整組資料行都是目前內容的一部分。 如果您有多個以關聯性連結的資料表,而且您執行工作的樞紐分析表已經透過加入資料行標題及使用交叉分析篩選器進行篩選,則內容會包含相關的資料表以及資料的任何篩選。
內容是效用強大的概念,但也可能會使公式的疑難排解變得很困難。 建議您從簡單的公式和關聯性開始,以了解內容的運作情形,然後再在樞紐分析表中使用簡單公式開始進行實驗。 下一節也提供一些範例,說明公式如何使用不同類型的內容以動態方式傳回結果。
公式中的內容範例
RELATED 函數可擴充目前資料列的內容來包含相關資料行內的值, 這可以讓您執行查閱。 本主題中的範例說明篩選與資料列內容的互動。
FILTER 函數可讓您指定要包含在目前內容中的資料列。 本主題的範例也將說明如何在執行彙總的其他函數中嵌入篩選。
ALL 函數可在公式之中設定內容。 您可以使用它來覆寫套用為查詢內容結果的篩選。
ALLEXCEPT 函數可讓您移除所指定篩選以外的所有篩選。 兩個主題都包含範例,可讓您逐步建立公式及了解複雜的內容。
EARLIER 和 EARLIEST 函數都可讓您透過執行計算對資料表執行迴圈,同時參考內部迴圈的值。 如果您很熟悉遞迴的概念以及內部和外部迴圈,將深刻領會 EARLIER 和 EARLIEST 函數所提供的強大效用。 如果您不太熟悉這些概念,應該小心地遵循範例中的步驟執行,以了解內部和外部內容如何運用於計算中。
參考完整性
本節討論與經由關聯性連接之 PowerPivot 資料表中遺漏的值相關的一些進階概念。 如果您有包含多個資料表的活頁簿和複雜的公式,而且需要協助以了解結果,本節就會非常有用。
如果您不熟悉關聯式資料的概念,我們建議您先閱讀簡介主題:<關聯性概觀>。
參考完整性與 PowerPivot 關聯性
PowerPivot 不需要在兩個資料表間強制執行參考完整性來定義有效的關聯性;但是在每個一對多關聯性的「一」端都會建立一個空白資料列,而且會用來處理相關資料表中所有非相符的資料列。 它會有效地當做 SQL 外部聯結運作。
在樞紐分析表中,如果您依關聯性的一側分組資料,在關聯性多側上任何不相符的資料都會群組在一起,而且會包含在具有空白資料列標題的總計中。 空白標題大致相當於「未知的成員」。
了解未知的成員
如果您已使用過了多維度資料庫系統 (如 SQL Server Analysis Services),應該就很熟悉未知成員的概念。 如果這對您來說是新的詞彙,下列範例會說明什麼是未知的成員及其影響計算的方式。
假設您正在建立會加總每間商店之月銷售額的計算,但是 Sales 資料表中的某個資料行遺漏了店名的值。 假設 Store 與 Sales 的資料表是由店名所連接,您認為公式會出現何種情況? 樞紐分析表會如何分組或顯示未與現有商店關聯的銷售數字?
這是資料倉儲中常見的問題,其中事實資料的大型資料表在邏輯上必須與維度資料表相關,而這些維度資料表會包含有關商店、地區和其他用來分類與計算事實的屬性。 為了解決這個問題,與現有實體不相關的任何新事實都會暫時指派給未知的成員。 基於這個緣故,不相關的事實會在樞紐分析表中的空白標題底下以群組的方式出現。
空白值與空白資料列處理方式的比較
空白值不同於為了容納未知成員而加入的空白資料列。 空白值是用來表示 Null、空字串及其他遺漏值的一個特殊值。 如需有關空白值以及其他 DAX 資料類型的詳細資訊,請參閱<PowerPivot 活頁簿中支援的資料類型>。