DAX:表值函數 VALUES、DISTINCT和FILTERS

表值函數 VALUES, DISTINCT 都用於返回一列的唯一值,唯一的區別是處理表種空行的行爲不同。

當關系代表的約束無效時,數據模型會再關係的“一”端的任何表中自動創建一個空行,這就是空值的由來,也就是說,在一個1:M的關係中,如果“多”端在“一”端沒有對應的值,那麼數據模型默認把BLANK作爲值來關聯“多”端。

 一,VALUES函數

VALUES函數收到過濾上下文的影響,並可以添加BLANK行。

當輸入參數是列名時,返回一個包含來自指定列的唯一值的單列表,其重複值被刪除,只返回唯一值。當輸入參數輸入參數是表名時,返回指定表中的行,其重複的行被保留。 可以添加空白行。 

VALUES(<TableNameOrColumnName>) 

注意:當在已過濾的上下文中使用 VALUES 函數時,VALUES 返回的唯一值會受到過濾器的影響。

例如,如果按地區過濾,並返回城市值的列表,則該列表將僅包括過濾器允許的地區中的那些城市。 要返回所有城市,無論現有過濾器如何,都必須使用 ALL 函數從表中刪除過濾器。 

二,DISTINCT函數

DISTINCT函數的結果受當前過濾器上下文的影響,返回一個包含指定列的唯一值的單列表。 換句話說,重複值被刪除,只返回唯一值。

DISTINCT(<column>)

The VALUES function is similar to DISTINCT; it can also be used to return a list of unique values, and generally will return exactly the same results as DISTINCT. However, in some context VALUES will return one additional special value. For more information, see VALUES function.

三,VALUES函數和DISTINCT函數的異同

相同之處,DISTINCT函數和VALUES函數的結果受當前過濾器上下文的影響。

在大多數情況下,當參數爲列名時,VALUES 函數的結果與 DISTINCT 函數的結果相同,這兩個函數都刪除重複項並返回指定列的唯一值的列表。但是,存在一種特殊情況,如果從相關表中查找時,如果在一個表中缺少關係中引用的值,那麼這會導致VALUES 函數返回的結果中被添加一個BLANK值,此空白值很有用。在數據庫術語中,這被稱爲違反參照完整性。 當一個表正在更新而相關聯的表沒有更新時,可能會發生這種數據不匹配的情況。

四,使用SELECTEDVALUE代替VALUES的情況

儘管VALUES函數是一個表值函數,但是由於DAX的一個特性,單行單例的表可以像標量一樣使用,也可以使用VALUES來計算標量值,例如:

Australian Sales Tax =
IF(
    HASONEVALUE(Customer[Country-Region]),
    IF(
        VALUES(Customer[Country-Region]) = "Australia",
        [Sales] * 0.10
    )
)

推薦使用SELECTEDVALUE函數,性能更高,代碼更簡單:

Australian Sales Tax =
IF(
    SELECTEDVALUE(Customer[Country-Region]) = "Australia",
    [Sales] * 0.10
)

1,HASONEVALUE函數

當 columnName 的上下文被過濾成一個值時,返回 TRUE,否則爲假。

HASONEVALUE(<columnName>) 

這個函數等價於:COUNTROWS(VALUES(<columnName>)) = 1

2,SELECTEDVALUE函數

當 columnName 的上下文被過濾成一個值時,返回該值,否則返回alternateResult。

SELECTEDVALUE(<columnName>[, <alternateResult>])

這個函數的結果等價於:

IF(HASONEVALUE(<columnName>), VALUES(<columnName>), <alternateResult>)

五,FILTERS函數

FILTERS函數返回被當前篩選上下文直接篩選的值,即過濾器直接應用到 <columnName> 的值。

FILTERS(<columnName>) 

跟VALUES函數的重要區別是:VALUES函數返回篩選上下文中的可見值,而FILTERS函數返回被篩選上下文直接篩選的值。

舉個例子,報表上有一個Color切片器,直接篩選了Red,Green和Blue三種顏色,由於篩選上下文中還存在其他切片器,因此報表中可能只有Red和Green可見,也就是說,Blue被其他切片器過濾掉了。在這種情況下,VALUES函數只會返回Red和Green,而FILTERS函數會返回被直接篩選的所有Color,即Red,Green和Blue。

 

參考文檔:

VALUES

Use SELECTEDVALUE instead of VALUES

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