Używanie funkcji SELECTEDVALUE zamiast VALUES

Jako modeler danych czasami może być konieczne napisanie wyrażenia języka DAX, które sprawdza, czy kolumna jest filtrowana według określonej wartości.

We wcześniejszych wersjach języka DAX to wymaganie zostało bezpiecznie osiągnięte przy użyciu wzorca obejmującego trzy funkcje języka DAX; IF, HASONEVALUE i VALUES. Poniższa definicja miary przedstawia przykład. Oblicza kwotę podatku od sprzedaży, ale tylko dla sprzedaży dokonanej dla klientów australijskich.

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

W tym przykładzie funkcja HASONEVALUE zwraca wartość TRUE tylko wtedy, gdy pojedyncza wartość kolumny Country-Region jest widoczna w bieżącym kontekście filtru. Gdy ma wartość TRUE, funkcja VALUES jest porównywana z tekstem literału "Australia". Gdy funkcja VALUES zwraca wartość TRUE, miara Sales jest mnożona przez 0,10 (reprezentującą 10%). Jeśli funkcja HASONEVALUE zwraca wartość FALSE — ponieważ więcej niż jedna wartość filtruje kolumnę , pierwsza funkcja IF zwraca wartość BLANK.

Zastosowanie metody HASONEVALUE jest techniką defensywną. Jest to wymagane, ponieważ istnieje możliwość, że wiele wartości filtruje kolumnę Country-Region . W tym przypadku funkcja VALUES zwraca tabelę wielu wierszy. Porównanie tabeli wielu wierszy z wartością skalarną powoduje wystąpienie błędu.

Zalecenie

Zaleca się użycie funkcji SELECTEDVALUE . Osiąga ten sam wynik co wzorzec opisany w tym artykule, ale jeszcze wydajniej i elegancko.

Korzystając z funkcji SELECTEDVALUE, przykładowa definicja miary jest teraz ponownie napisana.

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

Napiwek

Istnieje możliwość przekazania alternatywnej wartości wyniku do funkcji SELECTEDVALUE. Wartość wyniku alternatywnego jest zwracana, gdy do kolumny nie są stosowane żadne filtry lub wiele filtrów.