簡介

已完成

您也可以撰寫資料分析運算式 (DAX) 公式,以便將計算資料表新增至您的模型。 此公式可以複製或轉換現有模型資料,以便產生新的資料表。

注意

計算資料表無法連線至外部資料,您必須使用 Power Query 來完成這項工作。

計算資料表公式必須傳回資料表物件。 最簡單的公式可以複製現有的模型資料表。

計算資料表有其代價:這種資料表會增加模型儲存大小,並延長資料重新整理時間。 這是因為當計算資料表與重新整理過的資料表在公式上具有相依性時,計算資料表會重新計算。

複製資料表

下一節會介紹一種設計上常見的難題,可以透過建立計算資料表的方式加以解決。 首先需下載 Adventure Works DW 2020 M03.pbix 檔案,然後切換到模型圖表。

在模型圖表中,請注意 Sales 資料表與 Date 資料表具有三種關聯性。

圖中顯示兩份資料表:Sales 和 Date。資料表間有三種關聯性。只有一種作用中的關聯性。

模型圖表顯示了三種關聯性,因為 Sales 資料表儲存銷售資料時,會依訂單日期、出貨日期及到期日加以區分。 查看 OrderDateKeyShipDateKeyDueDateKey 資料行時,請留意以實線表示的一種關聯性,也就是作用中的關聯性。 以虛線表示的其他關聯性屬於非作用中的關聯性。

注意

任兩個模型資料表之間只能有一種作用中的關聯性。

在此圖表中,將游標停留在作用中的關聯性,即可反白顯示相關的資料行;可藉此方式與模型圖表互動,以了解相關的資料行。 此時,作用中的關聯性會篩選 Sales 資料表中的 OrderDateKey 資料行。 因此,套用至 Date 資料表的篩選條件會傳播至 Sales 資料表,並依訂單日期進行篩選;永遠不會依出貨日期或到期日進行篩選。

下一個步驟是刪除 Date 資料表和 Sales 資料表之間的兩個非作用中關聯性。 若要刪除關聯性,請在關聯性上按滑鼠右鍵,然後選取操作功能表中的 [刪除]。 請確認您刪除了兩個非作用中的關聯性。

接著新增資料表,並允許報表使用者依出貨日期篩選銷售。 切換到報表檢視,然後從 [模型] 功能區索引標籤的 [計算] 群組內,選取 [新增資料表]。

圖中顯示 [Power BI Desktop 模型] 功能區索引標籤。在 [計算] 群組內,會反白顯示 [新增資料表] 命令。

在功能區底下的公式列中,輸入下列的計算資料表定義,然後按下 [Enter]。

Ship Date = 'Date'

計算資料表定義會複製 Date 資料表的資料,產生名為 Ship Date 的新資料表。 Ship Date 資料表與 Date 資料表的資料行和資料列完全相同。 當 Date 資料表的資料重新整理時,Ship Date 資料表便會重新計算,因此兩者會隨時同步。

切換至模型圖表,然後注意新增的 Ship Date 資料表。

圖中顯示 Ship Date 資料表,包含與 Date 資料表相同的資料行。

接下來,在 Ship Date 資料表中的 DateKey 資料行和 Sales 資料表中的 ShipDateKey 資料行之間建立關聯性。 您可以將 Ship Date 資料表中的 DateKey 資料行拖曳至 Sales 資料表中的 ShipDateKey 資料行,以建立關聯性。

計算資料表只會複製資料,不會複製資料行可見性或階層等任何模型屬性或物件。 如有需要,您必須為新的資料表設定這些項目。

提示

您可以重新命名計算資料表的資料行。 在此範例中,建議重新命名資料行,以便更清楚地描述其用途。 例如,Ship Date 資料表中的 Fiscal Year 資料行可以重新命名為 Ship Fiscal Year。 因此,當 Ship Date 資料表中的欄位用於視覺效果時,其名稱會自動納入視覺效果標題或軸標籤等標題中。

為了讓 Ship Date 資料表的設計更加完善,可採取以下動作:

  • 重新命名下列資料行:
    • Date 改為 Ship Date
    • Fiscal Year 改為 Ship Fiscal Year
    • Fiscal Quarter 改為 Ship Fiscal Quarter
    • Month 改為 Ship Month
    • Full Date 改為 Ship Full Date
  • 依據 Ship Date 資料行,排序 Ship Full Date 資料行。
  • 依據 MonthKey 資料行,排序 Ship Month 資料行。
  • 隱藏 MonthKey 資料行。
  • 建立名為 Fiscal 的階層,並包含下列層級:
    • Ship Fiscal Year
    • Ship Fiscal Quarter
    • Ship Month
    • Ship Full Date
  • 使用 Ship Date 資料行,將 Ship Date 資料表標記為 Date 資料表。

如先前所述,當兩個資料表之間有多種關聯性時,很適合在此情境下使用計算資料表, 也可以用來將 Date 資料表新增至您的模型。 需要 Date 資料表才能套用稱為時間智慧的特殊時間篩選條件。

建立 Date 資料表

在下一個範例中,將會建立第二個計算資料表,而這次是使用 CALENDARAUTO DAX 函式。

使用下列定義建立 Due Date 計算資料表。

Due Date = CALENDARAUTO(6)

CALENDARAUTO DAX 函式會採用單一的選擇性引數,也就是一年中的最後一個月數,並傳回單一資料行的資料表。 如果您未傳入月數,則會假設是 12 (即 12 月)。 舉例來說,Adventure Works 的會計年度會在每年的 6 月 30 日結束,因此會傳入 6 (即 6 月) 這個值。

函式會掃描您模型中的所有日期和日期/時間資料行,以判斷最早和最後儲存的日期值。 接著會產生一組完整的日期,並涵蓋您模型中的所有日期,以確保載入整年的日期。 例如,如果儲存在模型中的最早日期是 2021 年 10 月 15 日,則 CALENDARAUTO 函式傳回的第一個日期會是 2021 年 7 月 1 日。 如果儲存在模型中的最新日期是 2022 年 6 月 15 日,則 CALENDARAUTO 函式傳回的最後日期會是 2022 年 6 月 30 日。

實際上,CALENDARAUTO 函式可確保滿足下列標記 Date 資料表的需求:

  • 此資料表必須包含 Date 資料類型的資料行。
  • 此資料行必須包含完整年份。
  • 此資料行不能有日期遺漏。

提示

您也可以使用 CALENDAR DAX 函式,並傳遞代表日期範圍的兩個日期值,來建立日期資料表。 該函式會針對範圍內的每個日期產生一個資料列。 您可以傳入靜態日期值或傳入運算式,從模型中的特定資料行擷取最早/最晚的日期。

接著切換至資料檢視畫面,然後在 [欄位] 窗格中選取 Due Date 資料表。 現在,請檢閱日期的資料行。 建議您透過排序來查看第一個資料列中的最早日期,方法是選取 Date 資料行標頭中的箭頭,然後以遞增順序排序。

注意

排序或篩選資料行都不會改變儲存值的方式。 這些函式可協助您探索及了解資料。

圖中顯示在資料檢視中的 Due Date 資料表。其中有一個名為「Date」的資料行,當其值從最早排序至最晚時,第一個日期會是 2017 年 7 月 1 日。

現在已選取 Date 資料行,請檢閱狀態列中的訊息 (位於左下角)。 此訊息會說明資料表儲存的資料列數量,以及在選取的資料行中找到多少相異值。

圖中顯示狀態訊息:資料表:到期日 (1461 列) 資料行:日期 (1,461 個相異值)。

當資料表資料列與相異值相同時,表示該資料行包含唯一值。 此要素很重要,原因有兩個:可滿足標記 Date 資料表的需求,並允許此資料行在模型關聯性中做為單側使用。

包含日期資料行的資料表每次重新整理時,Due Date 計算資料表都會重新計算。 換句話說,當資料列載入訂單日期為 2022 年 7 月 1 日的 Sales 資料表時,Due Date 資料表將會自動延伸,以涵蓋到隔年年底的日期:2023 年 6 月 30 日。

Due Date 資料表需要額外的資料行來支援已知的篩選條件和分組需求,特別是以年、季和月為依據。