時間篩選為何無效?2個案例解析 Power BI 日期維度表的重要性!

前言

許多新手在剛開始學習 Power BI 時,往往會驚艷於它的高度互動性,並迫不及待地將手邊所有資料表匯入其中。

然而,當資料量逐漸增長,報表的複雜度也隨之提升,日期的管理問題便成了許多人的一大困擾。

常見的做法是:

  • 直接在每張資料表中建立自己的日期欄位,但這樣容易導致時間篩選不一致。
  • 在資料模型中建立錯誤的關聯,使得時間分析無法正確運作。

這些做法雖然在小型報表中可能看不出問題,但當模型變得更加複雜,這些錯誤將導致時間篩選無效、DAX 計算錯誤,甚至報表效能下降

解決這些問題的關鍵,就是建立一個統一的「日期維度表」,讓所有時間相關的分析都能有條不紊地進行。

本篇文章將帶你深入了解為什麼需要日期維度表?如何正確建立?以及如何最佳化 Power BI 資料模型?

無論你是 Power BI 新手或進階使用者,都能從這篇文章中找到實用的解決方案!

【🆓 免費資源】從零開始,理解 Power BI 與 DAX 函數底層邏輯 🚀
如果你想:
  • 擺脫用 Excel 製作重複性報表的無限輪迴
  • 克服用 Excel 只能存一百萬列資料之限制
  • 徹底理解 Power BI 與 DAX 函數底層邏輯
  • 了解學習 Power BI 在就業市場的競爭力
歡迎點擊下方按鈕,報名免費課程。
我們還會送你一套《DAX 函數從零到壹學習藍圖》!萃取數十個常用函數,幫助你學習有方向!
免費 Power BI & DAX 課程 立即報名免費課程,領取藍圖!
—— Stark:雖然是免費課程,但內容絕對不馬虎,推薦你找時間好好看完!

為什麼需要日期維度表?

需求案例 1:多資料表篩選

在深入探討日期維度表的重要性之前,讓我們先來看看一個人力資源管理中的實際案例,這是許多 Power BI 新手常遇到的問題。

資料表概覽

假設我們將以下兩張資料表匯入 Power BI 進行分析:

為簡化說明,僅使用少量假資料演示。

1. 打卡紀錄表

這張表記錄了公司三位員工的上下班打卡時間,範圍涵蓋 2025/02/27 ~ 2025/03/05,共四天的資料(如下圖 1,使用不同顏色標示)。

其中,有些日期被跳過代表是假日沒上班。

📌 欄位包含:

  • 員工編號
  • 打卡日期
  • 上班時間
  • 下班時間

📌 用途

  • 透過打卡資料分析員工的工時表現
  • 用於計算薪資或考勤狀況
打卡紀錄表
▲ 圖一、打卡紀錄表
2. 薪水紀錄表

此表負責記錄每位員工的薪資發放狀況(如下圖 2)。

📌 假設條件

  • 發薪日為每月 1 日,本範例中為 2025/03/01
  • 每位員工的薪資固定,不考慮變動因素

📌 欄位包含:

  • 員工編號
  • 發薪日期
  • 薪水
薪水紀錄表
▲ 圖二、薪水紀錄表

資料模型

當 Power BI 初學者將這兩張表匯入後,常見的錯誤做法是直接將「打卡日期」與「發薪日期」建立關聯(如下圖 3)。

打卡紀錄表與薪水紀錄表之資料模型
▲ 圖三、打卡紀錄表與薪水紀錄表的關聯方式

由於這兩個日期在上述任一個表中都具有重複值,因此關聯為「多對多」關聯,可以從線段兩端的「*」圖示辨識出來。

除此之外,關聯的方向為打卡紀錄表流向薪水紀錄表,可從箭頭方向「▶」判斷出來。

這樣的關聯會導致一個嚴重的問題 —— 時間篩選功能失效

視覺化結果

根據以上的關聯,若我們在視覺化圖表中,想要透過「選擇日期來各別顯示員工打卡紀錄與發薪紀錄」,可以拉出如圖四的圖表。

利用打卡日期篩選
▲ 圖四、選擇日期以顯示員工打卡紀錄與發薪紀錄的困境

圖四包含一個最上方的日期篩選器,左下角是顯示員工打卡紀錄,右下角是顯示員工發薪紀錄。

由於最上方的日期篩選器是使用「打卡日期」欄位,當使用者選擇 2025/02/27 時,雖然會顯示出對應的打卡紀錄(紅色線與框框),但不會顯示薪水的紀錄(藍色線與框框)。

原因是薪水的「發薪日」為 2025/03/01,而打卡紀錄中沒有該日期,因此 Power BI 無從篩選。

這個問題的根本原因在於:

  1. 打卡日期 ≠ 發薪日期
    • 這兩個日期屬於不同的業務概念,不能直接建立關聯。
  2. 缺乏統一的時間軸
    • 打卡日期不包含發薪日期,因此篩選無法作用於薪水紀錄表。
  3. 使用「多對多」關聯,影響篩選效果
    • 這種關聯方式可能導致意外的資料過濾問題。

為了解決這類時間篩選問題,我們需要引入一張「日期維度表」(Date Dimension),讓所有涉及時間的數據都能使用相同的時間軸,以確保篩選功能能夠正常運作。

需求案例 2:時間相關計算

另一個經常需要日期維度表的場景,是所有涉及時間比較與累積計算的分析,例如:

📌 常見時間分析指標

  • 累積計算:今年至今(YTD)、本季至今(QTD)、本月至今(MTD)
  • 同期比較:去年同期(PY)、去年同月(PM)
  • 成長率分析
    • 月增率(MoM%) = (本月值 – 上月值) / 上月值
    • 年增率(YoY%) = (今年值 – 去年值) / 去年值
  • 其他進階時間運算
    • 滾動平均(Rolling Average)
    • 移動窗口計算(Moving Window)

這些計算在 Power BI 中依賴一組強大的 DAX 內建函數,稱為「時間智慧函數(Time Intelligence Functions)」,它們可以幫助開發者輕鬆處理日期相關運算。

Power BI 提供了許多常見的時間運算函數,例如:

  • TOTALYTD():計算「年初至今」的累積值
  • SAMEPERIODLASTYEAR():返回去年同期的數據
  • PARALLELPERIOD():計算指定時間範圍內的值(例如上一季)
  • DATEADD():向前或向後偏移指定時間區間

然而,這些函數的使用條件是 —— 資料模型中必須存在「日期維度表」,且該表必須被標記為「日期表」(Mark as Date Table)

🚨 如果沒有正確建立日期維度表,這些時間函數將無法運作,或返回錯誤的結果!

日期維度表是什麼?

在 Power BI 的資料模型中,日期維度表(Date Dimension Table) 也常被稱為日期表日曆表

然而,我更習慣使用「日期維度表」這個名稱,因為它清楚地表達了這張表的兩個核心特性:「日期」與「維度」

📌 「日期」 代表這張表專門存放與時間相關的資訊,例如日期、年份、月份、季度、星期等。

📌 「維度」 則屬於資料模型的概念,簡單來說,它提供了一個標準化的時間軸,讓我們可以在報表中進行準確的時間分析和篩選。

「維度」的概念較為進階,單靠一篇文章可能難以完整說明。

如果你對資料模型的基礎架構感興趣,特別是維度表與事實表的關係,我推薦你索取我的免費資源,其中不僅詳細介紹了這些概念,還能幫助你建立更高效的 Power BI 報表!

這對於剛開始接觸多表關聯的新手來說,將是一個極具價值的學習資源。🚀

如何用日期維度表優化資料模型?

在前面的案例中,我們已經看到沒有日期維度表可能導致的問題。

接下來,我們將學習如何正確建立日期維度表,並將其與其他資料表建立關聯,以提升 Power BI 模型的準確性與靈活性

新增日期維度表

建立日期維度表的方法有多種,我個人習慣使用 Power Query 透過 M 語言 來產生這張表。

這種方式不僅靈活,還可以根據需求自訂日期欄位,例如:

  • 年、月份、星期
  • 季度、會計年度
  • 週數(ISO Week Number)
  • 是否為假日(可手動標註)

如果你希望快速建立日期維度表,可以參考這篇教學,該網站提供了一段 M 語言程式碼,你只需複製並貼到 Power Query 中,即可自動產生完整的日期表,最後會產生如圖五的日期維度表。

日期維度表
▲ 圖五、日期維度表

這張表將成為我們資料模型的標準時間軸,確保所有與時間相關的分析都能一致運作。

建立關聯

延續本文前面提到的案例一,我們要將日期維度表其他資料表建立正確的關聯,以解決時間篩選失效的問題。

📌 正確的關聯設定如下

  • 日期維度表(Date) → 打卡紀錄表(打卡日期)
  • 日期維度表(Date) → 薪水紀錄表(發薪日期)

這樣的設計確保了:

單一時間軸:所有的時間篩選都基於「日期維度表」,確保篩選結果正確。

一對多關聯:日期維度表的 Date 欄位是唯一值(One),而打卡紀錄表和薪水紀錄表的日期會重複(Many)。

強化時間運算:這樣的結構允許 Power BI 的時間智慧函數(如 YTD、QTD)正常運作。

關聯方向與最佳實踐

📌 為什麼要用「一對多」?

在 Power BI 中,維度表(Dimension Table)通常作為「過濾條件」,影響到事實表(Fact Table)

就是為什麼日期維度表應該是「一對多」的 One-to-Many 關聯,而不是 Many-to-Many,因為:

  • One(1)端是唯一值 → 日期維度表的 Date 欄位每一天只會出現一次
  • Many(*)端是非唯一值 → 打卡紀錄表、薪水紀錄表可能有多筆相同日期的資料

📌 關聯應該是「單向過濾」

預設情況下,Power BI 會將關聯設為單向過濾(Single Direction),即:

  • 日期維度表影響事實表
  • 事實表不影響日期維度表

這樣的設定確保了篩選條件能夠正確應用,避免報表產生意外的計算錯誤。

圖六顯示建立好關聯後的樣子。

利用日期維度表為基礎的資料模型
▲ 圖六、引入日期維度表後的資料模型

建立以日期維度表為基礎的篩選

首先,我們將篩選條件改為來自日期維度表的 Date 欄位,就能確保所有報表中的資料表都能正確同步篩選,如下圖七所示。

利用日期維度表篩選
▲ 圖七、利用日期維度表的日期篩選發薪紀錄

📌 主要變化

  • 原先的篩選器可能會因資料表的關聯設定而無法同時影響「打卡紀錄表」與「薪水紀錄表」。
  • 當篩選條件來自「日期維度表」,它能夠影響所有關聯的資料表,確保篩選結果一致。
  • 這樣的設計讓我們能夠同時篩選打卡與薪資發放的記錄,解決原先篩選條件無效的問題。

P.S. 此處我有先把沒資料的日期給排除(如:2025/02/28),不然原本應該會是一個連續的日期清單。

單獨篩選某一天的資料

圖七中,當我們在篩選器中選擇 2025/03/01,可以發現:

  • 薪水紀錄表(右下角)顯示了當天的發薪記錄。
  • 打卡紀錄表(左下角)則沒有任何資料,因為該天沒有打卡記錄。

這代表我們的篩選器現在可以正常運作,正確顯示對應的薪水發放資訊,而不會影響其他日期的資料。

同理,當選擇 205/02/27 時,也會獲得對應的左下角打卡紀錄,而發薪紀錄為空白,如圖八所示。

利用日期維度表篩選
▲ 圖八、利用日期維度表的日期篩選打卡紀錄

同時篩選多個日期

當我們同時選擇 2025/02/272025/03/01,會發現:

  • 左下角顯示 2025/02/27 的打卡紀錄
  • 右下角顯示 2025/03/01 的發薪紀錄

這證明日期維度表成功整合了不同資料表的時間範圍,讓我們能夠透過同一個篩選條件,獲得所有時間相關的數據。

利用日期維度表篩選
▲ 圖九、利用日期維度表的日期同時篩選打卡與發薪紀錄

為什麼這樣設計更好?

確保篩選條件適用於所有相關資料表

解決原本無法篩選不同表格的問題

讓時間智慧函數(如 YTD、QTD)能夠正確運作

避免多對多關聯導致篩選失效

透過這樣的設計,我們不僅讓 Power BI 的資料模型更加穩定,也讓時間篩選更具彈性

在之後的時間分析(如年初至今 YTD、月增率 MoM%、年度成長率 YoY%)中,這樣的日期維度表都將發揮關鍵作用。

結語

在本篇文章中,我們深入探討了日期維度表在 Power BI 資料模型中的重要性,並透過實際案例展示了如果沒有使用日期維度表,可能會遇到的問題,例如:

時間篩選無法同步應用於多張資料表

時間智慧函數(如 YTD、QTD、YoY)無法正常運作

資料模型因為錯誤的關聯設定,導致篩選結果不如預期

透過正確建立日期維度表,並將它作為所有時間欄位的關聯來源,我們可以:

🎯 確保篩選條件正確影響所有報表數據

🎯 提升 Power BI 報表的靈活性與計算準確度

🎯 讓所有時間相關計算都能無縫執行

希望透過這篇文章,讓你理解了日期維度表的重要性。也期許你未來能夠直接應用在你的專案中,不再因為日期欄位而感到困惑!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *