上下文的傳遞性

當DAX表達式內需要對多個表單中的內容進行計算時,需要特別注意上下文的傳遞性。行上下文關係在表之間不具有自動傳播性。例如Bike表和Sales表之間是一對多的關聯關係,如果想計算每種產品的銷售額,直接使用Sales[Volume]*Bike[Price]進行計算時Power BI會報錯,提示無法獲取當前Bike列中的Product值,即兩個表單雖然有關聯關係,但通過行上下文無法從Sales表獲取Bike表中對應的信息。此時,必須藉助RELATED函數才能將行上下文的過濾條件傳遞給對應表單,從而獲取所需數據進行計算。

在這裏插入圖片描述
與行上下文不同,篩選上下文在表之間存在傳遞關係,在多對一關聯關係中,應用在多的一方的篩選條件可以自動傳播到一的一方對其進行篩選。例如在下面的表集羣當中,Sales表和Bike表是多對一關係,Bike表和Product Category表也是多對一關係,這三張表可以聯合成一張虛擬的大表,這個虛擬表中包含三張表中全部的數據列,使得應用到Sales表上的篩選條件,可以傳遞到Bike表以及Product Category表當中,並且通過應用到Sales表上的一個篩選條件,必定可以在Bike表和Product Category表中篩選出唯一一組符合條件的數據。

在這裏插入圖片描述
需要注意的是,如果想利用篩選上下文在多對一關係的表之間具有傳遞性這一特點,通過對一個表的篩選來過濾另外一個表中的數據,在ALL函數的使用上需要特額外小心。例如下面這兩個表達式看似非常相近,但實際上獲得的結果完全不同。

All_Column =
CALCULATE (
    COUNTROWS ( 'Product Category' ),
    FILTER (
        ALL ( 'Bike'[Product] ),
        'Bike'[Product] = "Mountain Bike"
    )
)

All_Table =
CALCULATE (
    COUNTROWS ( 'Product Category' ),
    FILTER (
        ALL ( 'Bike' ),
        'Bike'[Product] = "Mountain Bike"
    )
)

在這裏插入圖片描述
這兩個表達式的區別主要在於,All_Column內使用ALL函數去除了Bike表內Product列上的篩選條件,之後再篩選’Bike’[Product] = "Mountain Bike"的數據,而All_Table則用ALL函數去掉了整個Bike表上的篩選條件,然後再篩選’Bike’[Product] = "Mountain Bike"的數據。

All_Column 表達式計算出錯是由於Product列並不存在於Product Category表中,這樣導致只針對Product列上的任何過濾篩選都不會對Product Category表產生影響,因此,在All_Column表達式當中,COUNTROWS函數的計算範圍讓然是整個Product Category表,所以獲得的結果是2,而不是1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章