LuckyTemplates 中的擴展表

LuckyTemplates 中的擴展表

在本教程中,我們將研究一個非常具體的場景,我相信你們所有人在使用 DAX 時都已經遇到過——擴展。如果您不知道擴展表的實際工作原理,它們可能會擾亂您的計算。您可以在本博客底部觀看本教程的完整視頻。

對於此示例,我們使用 Contoso 數據庫,其中包含銷售表客戶表日期表產品表產品類別 產品子類別

在左端,產品、類別、子類別和銷售表之間存在一對多關係。我們在客戶和銷售之間以及日期和銷售之間也有一對多的關係。

LuckyTemplates 中的擴展表

目錄

示例#1

假設我們要根據類別表中的此類別列創建一個報告,並使用一個度量來計算客戶表中有多少客戶。我們想按類別對客戶表的編號進行切片。

LuckyTemplates 中的擴展表

如果我在類別表上放置一個過濾器,該過濾器將轉到子類別表,然後到達產品表,最後到達並過濾銷售表。但是除非我們打開雙向過濾,否則該過濾器將無法過濾客戶的表。

讓我們回到報表來修正這個計算。我們可以將此計算包裝在 CALCULATE 函數中,然後編寫 Sales. 我們可以看到,這次我們沒有為視覺的每個單元格重複相同的數字。

LuckyTemplates 中的擴展表

為了驗證這個計算是否正確,我們可以從 sales 表中引入客戶鍵進行聚合,然後對其進行 Count (Distinct)。

LuckyTemplates 中的擴展表

LuckyTemplates 中的擴展表

您可以看到我們為每一行返回相同的值。通過在 CALCULATE 函數中使用銷售表,我們能夠修復計算。

LuckyTemplates 中的擴展表

例子#2

讓我們繼續下一個例子。對於這個,我們想確定 2007 年、2008 年或 2009 年紅色產品的銷售額。根據切片機的選擇,我還想倒退一年。

例如,如果我選擇 2009,我想報告 2008 年的紅色銷售額。如果我選擇 2008,我還想報告 2007 年的紅色銷售額。

LuckyTemplates 中的擴展表

紅色銷售 #1

我們的 Total Sales 的計算基本上是銷售數據的總和。在行上下文中,我們將數量乘以淨價。

LuckyTemplates 中的擴展表

讓我們創建一個新度量並將其命名為 Red Sales。我們將編寫 CALCULATE,然後是 Total Sales。我們將Sales 表以顯示產品的顏色等於紅色。

LuckyTemplates 中的擴展表

然後我們將在日期列中的日期上寫入

LuckyTemplates 中的擴展表

當我們將該計算帶入卡片視覺效果時,我們得到一片空白。

LuckyTemplates 中的擴展表

紅色銷售 #2

這裡發生了什麼?讓我們嘗試重寫該計算,看看我們是否能夠得到結果。我們將創建一個新度量並將其命名為 Red Sales 2,並將計算的第一部分用於 Red Sales 1。

LuckyTemplates 中的擴展表

我們將在第一個 CALCULATE 之上啟動另一個 CALCULATE。

LuckyTemplates 中的擴展表

讓我們將此度量帶入矩陣並查看結果。如果我們選擇 2008,我們會得到 51,947。如果我們選擇 2009,我們將得到 24,343。最後,如果我們選擇 2010,我們會得到 39,724。

LuckyTemplates 中的擴展表

紅色銷售 #3

這個計算還有另一種寫法。我們將編寫一個新度量並將其命名為 Red Sales 3,然後使用 CALCULATE 函數。

我們將計算總銷售額並將其寫入產品,顏色等於紅色。然後對日期使用 SAMEPERIODLASTYEAR 函數。

LuckyTemplates 中的擴展表

如果我們將度量 #3 拖到卡片視覺對像中,您可以看到這兩個卡片值返回相同的值,這是正確的。

但是我們的第一個計算有問題,因為我們返回的是空白而不是正確的值。

LuckyTemplates 中的擴展表

讓我們看看這裡到底發生了什麼。現在我們已經看到了一些關於擴展表的計算,讓我們了解它們背後的理論。

在了解什麼是擴展表之前,您需要了解我們這裡的所有表都稱為基表

LuckyTemplates 中的擴展表

那麼這些表什麼時候變成擴展表呢?一旦在一個表和另一個表之間創建了多對一關係,基表就變成了擴展表。

驗證擴展表

但是我們如何驗證表擴展是否真的發生了呢?那麼,您可以在任何表上使用 related 關鍵字。如果您能夠從一側訪問該列,那麼您就會知道可能會發生表擴展。

讓我們轉到銷售表並創建一個新的計算列。

LuckyTemplates 中的擴展表

假設我們要從產品表中檢索此特定產品密鑰的產品顏色。我們將使用 RELATED,它只會給出 IntelliSense 中實際上可以從銷售表擴展的列的列表。

我們可以看到客戶表和銷售表是多對一的關係。我們還可以看到客戶表列、日期表列和產品列的列表。

LuckyTemplates 中的擴展表

當我們選擇 Products[Color] 時,我們可以藉助 RELATED 關鍵字在 sales 表中創建一個新列。RELATED 只允許我們訪問基表實際可以擴展到的表的列。

如果我們將該關係的性質從多對一更改為多對多,則該計算將停止工作。

讓我們將這種關係​​的性質更改為多對多。我們可以在底部看到一個警告符號。

LuckyTemplates 中的擴展表

當我們返回到 sales 表時,我們會看到一條錯誤消息,指出 Products[Color] 列不存在,或者與任何表都沒有關係。

LuckyTemplates 中的擴展表

在當前上下文中,我們收到的警告不是很用戶友好。基本上,這意味著銷���表不能擴展到產品表,因為我們不能只訪問該特定行項目的一個值。

由於我們使用的是多對多關係,表擴展不會發生,RELATED 也不起作用。

讓我們回到圖表視圖並修復此計算。我們將關係的性質更改為多對一併激活該關係以使計算有效。

LuckyTemplates 中的擴展表

定義擴展表

在我們開始查看我們已經在報告中完成的計算之前,讓我們重申一下擴展表的定義。

如果你有一個星型模式的數據模型,如果維度和事實表之間存在多對一關係,事實表將擴展到數據模型中的所有表。

如果您有雪花模式,則產品子類別表和類別表將擴展到基表,在本例中為產品表。sales 表是基表,它擴展到所有其他表。

在幕後,銷售表將在一個表中包含所有列。請注意,表擴展只是一個邏輯概念,因此它不會擴展和增加數據模型的大小。

只有當您引用一個表(即基表)並且與其他表存在多對一關係時,擴展表才會出現。

切片類別列並使用擴展表

讓我們嘗試修復我們已經在報表視圖中完成的計算。在此示例中,我們按產品類別表中的類別列進行切片,並嘗試計算有多少客戶。

LuckyTemplates 中的擴展表

那麼我們實際上在這裡做什麼?我們使用擴展的銷售表作為參考。一旦過濾器上下文包含來自類別表的值,該過濾器將從子類別產品到達銷售表並直接到達銷售。

由於 sales 是一個擴展表並且我們在 CALCULATE 函數中使用該引用,因此 sales 表也將包含 customer 表的列。當我們間接地對銷售表應用過濾器時,我們也在過濾客戶表。

讓我們回到我們的紅色銷售計算並嘗試了解實際發生的情況。我們將從空白計算開始。如果我們選擇該度量,您可以看到我們正在編寫嵌套代碼。我們有計算,然後是總銷售額,對銷售額進行過濾,然後是 SAMEPERIODLASTYEAR。

LuckyTemplates 中的擴展表

讓我們一步一步地打破這個計算。首先,我們需要確定計算之外存在的外部過濾器上下文。

我們在 Calendar Year Number 切片器中選擇了 2008。

LuckyTemplates 中的擴展表

從這個過濾器上下文中,將評估銷售表。銷售表將僅包含 2008 年日曆年編號的行,產品顏色將為紅色。我們這裡有兩個過濾器:一個由過濾器上下文創建,另一個由過濾器創建

SAMEPERIODLASTYEAR 正在過濾器上下文中進行評估,其中年份為 2008 年。它將收到 2008 年的日期列表,並將這些日期從 2008 年轉移到 2007 年。由此返回的表將僅包含2007 年的日期。

一旦這兩個操作完成,CALCULATE 函數準備過濾器上下文並將這兩個過濾器應用到過濾器上下文中。當我們應用它時,我們有一個產品顏色等於紅色的過濾器上下文,並且在年份列上,我們有一個 2007 年和 2008 年的過濾器。

所以對於這個數據模型,不存在兩個不同年份的單一交易。當 CALCULATE 嘗試在and條件下合併這兩個過濾器時,它會說年份應該是 2008 年和 2007 年,並且產品顏色應該是紅色。

當我們使用 2008 年的過濾上下文過濾銷售表時,我們也在間接過濾日期表。銷售穩定與日期穩定具有多對一的關係。

讓我們創建一個新計算來確定日期表中相關日期的行數。我們將編寫 CALCULATE,然後是日期表的然後我們將過濾所有銷售表,我們將說日曆年編號中的相關日期應等於 2008 年。

LuckyTemplates 中的擴展表

在 CALCULATE 內部,我們沒有在日期表上引用任何過濾器。我們只是檢查日曆年數字中的日期是否應為 2008 年。理想情況下,此過濾器不應過濾日期表。我們還使用了函數,它將忽略來自切片器的過濾器上下文。

讓我們為這個計算創建一張新卡片。你可以看到我們返回了 348 行。

LuckyTemplates 中的擴展表

那麼,從 2500 行的日期表中,我們怎麼可能只返回 348 行呢?如果我們要使用擴展表,那麼我們也將間接過濾另一個通過多對一關係連接的表。

雖然我們在當年沒有任何過濾器,但我們仍然限制一側的維度表可見的行數。

當我們返回銷售表時,我們還會返回日期表、客戶表、產品表、產品類別表和產品子類別表的過濾版本。

解釋紅色銷售 2

讓我們繼續下一個計算,即 Red Sales 2。我們將從外部 CALCULATE 開始,因為如果我們在任何場景中嵌套此函數,則外部 CALCULATE 應該為內部 CALCULATE 準備篩選器上下文。

LuckyTemplates 中的擴展表

在切片器上,我們選擇日曆年 2008 年。當 SAMEPERIODLASTYEAR 函數獲取 2008 年的日期時,它將把這些日期轉移到 2007 年,並且它將成為內部計算的 FILTER 上下文。此內部 CALCULATE 將評估 2007 年。

FILTER 函數將過濾銷售表,銷售表將僅限於年份為 2007 年的行。一旦我們有了 2007 年的行,我們將檢查相關產品是否等於紅色。

與第一次計算不同,我們不會返回兩個不同的層。這兩個不同的層未應用於 FILTER 上下文,因此 FILTER 函數返回的表將包含銷售表的所有行。

應用此過濾器後,我們將獲得 2007 年的銷售額以及等於紅色的產品,而在第一個計算中,我們返回 2008 年和 2007 年。

這一次,我們通過使用 SAMEPERIODLASTYEAR 函數並將 CALCULATE 函數嵌套在另一個 CALCULATE 中,為銷售表準備了過濾器上下文。

解釋紅色銷售 3

對於第三個示例,我們有一個非常簡單的 CALCULATE 函數,其中包含兩個語句:一個是產品顏色等於紅色,然後是日期上的 SAMEPERIODLASTYEAR。

LuckyTemplates 中的擴展表

SAMEPERIODLASTYEAR 函數將在篩選器上下文中進行評估,該篩選器上下文將僅包含 2007 年的日期。產品的顏色將在產品表上應用紅色篩選器上下文,這將反過來篩選銷售表並僅包含行紅色產品。

當這兩個值應用於過濾器上下文時,它們將過濾銷售表而不是展開的銷售表。您可以看到我們在代碼中的任何地方都沒有引用擴展的銷售表。

如果您嘗試引用擴展表,這是您應該使用的理想方案。使用擴展表時,計算會變得非常複雜,有時您無法確定計算返回錯誤結果的原因。

如果您不了解擴展表的概念,您可能會開發此特定代碼作為模型度量,然後將其部署到生產中。其他用戶可能會開始基於此度量創建其他度量,並且他們可能無法弄清楚為什麼計算不起作用,因為他們對 DAX 語言的理解程度不高。

如果您使用的是 DAX,請始終嘗試將篩選器放在單個列上,因為當您使用單個列時,不會應用擴展表的概念。例如,當您使用PRODUCTS [Color] = “Red”時,過濾器到達銷售表,但該過濾器無法到達客戶表,因為我們沒有使用擴展的銷售表。

當使用單個列時,我們不引用擴展表的概念。我們只是在 sales 表上應用一個基本過濾器,它不會傳播到其他表。

使用 DAX Studio 驗證擴展表

在結束之前,我們將使用 DAX 工作室來驗證我們的 Red Sales 3 代碼。讓我們轉到“視圖”選項卡,單擊“性能分析器”,然後開始記錄。我們將刷新該視覺對象,並選擇一張空白卡片。

LuckyTemplates 中的擴展表

從外部工具,我們將啟動 DAX studio

LuckyTemplates 中的擴展表

我們可以看到,在底部的結果屏幕中,我們得到一片空白。

LuckyTemplates 中的擴展表

我們將打開 Server Timings 以了解在後台生成的查詢。我們將轉到 Server Timings 選項卡,展開它以查看所有內容。

我們正在左側的銷售表上執行 JOIN。我們還對產品表中的產品密鑰執行 JOIN。

LuckyTemplates 中的擴展表

在 WHERE 子句中,它表示日曆年數字中的日期應等於 2008 年並且產品顏色應為紅色。

LuckyTemplates 中的擴展表

然後我們有另一個條件說 Dates[Date],然後是日期範圍。那麼這些日期是什麼?理想情況下,這些日期必須屬於 2008 年,但當我們在 Excel 中更改這些數字的格式時,它們是 2007 年的。

LuckyTemplates 中的擴展表

這就是我們返回空白值的原因。我們說日曆年應該是 2008 年,並應用日期應該是 2007 年的 AND 條件。這個 2007 年是因為我們在計算中使用了 SAMEPERIODLASTYEAR 函數。

讓我們更改對 Red Sales 2 的度量和引用。執行代碼後,您可以看到我們正在從日期表中獲取日期,然後我們正在篩選日期列以獲取 2008 年的日曆年數。

這一次,我們能夠返回一個結果,因為我們沒有在 WHERE 子句上應用過濾器,並且我們說日曆年數字中的日期應該等於 2008。

LuckyTemplates 中的擴展表


在哪裡可以找到隱藏的 DAX 陷阱
在 LuckyTemplates 中使用 DISTINCTCOUNT 隨著時間的推移對客戶進行計數
使用高級 DAX 進行新客戶分析

結論

希望本教程有助於理解什麼是擴展表以及它如何擾亂您的計算。展開的表格不是很直觀,也不容易理解。

有關擴展表的更多信息,請不要忘記訂閱 LuckyTemplates 電視頻道​​。我和一系列內容創作者一直在發布大量內容,所有內容都致力於改進您使用 LuckyTemplates 和 Power Platform 的方式。


什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

如何在 R 中保存和加載 RDS 文件

如何在 R 中保存和加載 RDS 文件

您將學習如何在 R 中保存和加載 .rds 文件中的對象。本博客還將介紹如何將對像從 R 導入 LuckyTemplates。

回顧前 N 個工作日——DAX 編碼語言解決方案

回顧前 N 個工作日——DAX 編碼語言解決方案

在此 DAX 編碼語言教程中,了解如何使用 GENERATE 函數以及如何動態更改度量標題。

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

本教程將介紹如何使用多線程動態可視化技術從報告中的動態數據可視化中創建見解。

LuckyTemplates 篩選上下文簡介

LuckyTemplates 篩選上下文簡介

在本文中,我將貫穿過濾器上下文。篩選上下文是任何 LuckyTemplates 用戶最初應該了解的主要主題之一。

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

我想展示 LuckyTemplates Apps 在線服務如何幫助管理從各種來源生成的不同報告和見解。

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

了解如何在 LuckyTemplates 中使用度量分支和組合 DAX 公式等技術計算利潤率變化。

DAX Studio 中數據緩存的物化想法

DAX Studio 中數據緩存的物化想法

本教程將討論數據緩存物化的想法,以及它們如何影響 DAX 在提供結果時的性能。

使用 LuckyTemplates 進行業務報告

使用 LuckyTemplates 進行業務報告

如果直到現在你還在使用 Excel,那麼現在是開始使用 LuckyTemplates 來滿足你的業務報告需求的最佳時機。

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的