1. 程式人生 > 其它 >DAX:表值函式 VALUES和DISTINCT

DAX:表值函式 VALUES和DISTINCT

表值函式 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>)

參考文件:

VALUES

Use SELECTEDVALUE instead of VALUES