Context (語境)在 Power BI 的繁體中文官方文件中,被譯為上下文。但我自己認為語境相對有畫面感,而且我自己認為語境給人的感覺更加接近 使用者操作 Power BI 行程報表時,使用者腦袋中想的事情,以及 DAX evaluation 的方式,所以這邊以語境翻譯。
另外,因為討論 DAX,一定避不開資料模型,所以這裡先附上資料模型的圖。
在微軟的文件中,語境被分為三種:列 (Row)、篩選 (Filter) 以及 查詢 (Query)。從表格的操作來歸納的話,後兩者其實都是在篩選列,因此我選擇把篩選語境跟查詢語境都放到篩選語境中。
(Power BI 權威 SQL BI的文章中 中也是放在一起,但他還提到了兩者其實有所差別,但我自己目前還沒有體會到實際的差別,因此還請大家小心使用)
而篩選語境的用途,是篩選出表格中接下來有哪些列會參與運算。
以 Sales Revenue = SUM( 'order'[total_amount])
這個 DAX 以及下面的樞紐分析表為例。
圖中的黃色數字那一格 7594
在計算時,執行的順序是:
其中第一步就是所謂的篩選語境。它關注的是使用者拖拉形成視覺效果時,使用者心中所想以及 DAX 計算彼此間的互動關係。
以 5794 這一格來說,使用者心中所預期的是「 catering 在 2021 年的營收是多少」,DAX 便透過視覺效果傳來的值(2021, Catering) 形成篩選語境,在 order
這張表篩選出對應的列,傳到接下來的函數中做運算。這類透過視覺效果形成的篩選語境,正是 Power BI 官方文件中 所謂的查詢語境。
除了透過視覺效果表達篩選語境外,也可以透過 DAX 表達篩選語境,這也為 DAX 帶來了更出色的表達能力。比方說,在看完 catering 的營收後,產品部門開始想知道 catering 的營收佔所有營收的多少百分比呢?這時使用者心中所希望看到的視覺效果如下:
Catering | |
---|---|
year | Sales revenue |
2021 | 20% |
其中 20 % = catering 的營收 / 所有產品的營收,其篩選語境如下:
這時就需要新增一個量值: Sales Revenue (Product Context Invariant) := Calculate ([Sales Revenue], ALL(Product))
簡單來說,這個量值想表達,計算營收時,請排除所有來自 Product 這一張表的篩選。
從下面的樞紐分析表可以清楚看到 Sales Revenue (Product Context Invariant)
保留視覺效果中來自年份的篩選語境,但是排除了產品的篩選語境,所以 catering 跟 Meetings Essentials 的 Sales Revenue (Product Context Invariant)
量值相同。
以 DAX 表達篩選語境還有很多其他的做法,像是 Filter()
, USERELATIONSHIP
, 和 CROSSFILTER
都是透過 DAX的方式 去強制篩選、換欄位篩選,或是逆向篩選 來表達篩選表格的不同方式。
透過視覺效果表達的篩選語境,是使用者或是報表開發者在拖拉報表時產生的篩選語境。透過 DAX 表達的篩選語境則是語意模型開發者事前預測報表開發者會如何拖拉量值而事先設計好的篩選語境。
篩選語境介紹到這裡,接下來會介紹列語境 (Row Context)。