Udostępnij za pośrednictwem


Użyj SELECTEDVALUE zamiast VALUES

Jako modeler danych czasami może być konieczne napisanie wyrażenia DAX, które sprawdza, czy kolumna jest filtrowana według określonego value.

W earlier wersjach DAXto wymaganie zostało bezpiecznie osiągnięte przy użyciu wzorca obejmującego trzy funkcje DAX; IF, HASONEVALUEandVALUES. Poniższa definicja measure 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 TRUE tylko wtedy, gdy pojedyncza value kolumny Country-Region jest widoczna w bieżącym kontekście filter. Gdy jest TRUE, funkcję VALUES porównuje się z dosłownym tekstem "Australia". Gdy funkcja VALUES zwraca wartość TRUE, sprzedaż measure jest mnożona przez 0,10 (co odpowiada 10%). If funkcja HASONEVALUE zwraca FALSE— ponieważ więcej niż jeden valuefilters kolumnie — funkcja firstIF zwraca BLANK.

Zastosowanie HASONEVALUE jest techniką defensywną. Jest to wymagane, ponieważ istnieje możliwość, że wiele valuesfilter w kolumnie Country-Region. W tym przypadku funkcja VALUES zwraca tabelę wielu wierszy. Porównanie tabeli z wieloma wierszami do skalarnej value skutkuje error.

Zalecenie

Zaleca się użycie funkcji SELECTEDVALUE. Osiąga ten sam wynik co wzorzec opisany w tym artykule, ale robi to bardziej wydajnie i elegancko and.

Korzystając z funkcji SELECTEDVALUE, przykładowa definicja measure jest now przepisana.

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

Napiwek

Możliwe jest przekazanie alternatywnego wyniku value do funkcji SELECTEDVALUE. Alternatywny wynik value jest zwracany, albo gdy nie stosuje się filters—or, albo gdy nie ma wielokrotności filtersstosowanych do kolumny.