Ulepszanie formuł języka DAX przy użyciu zmiennych

Jako modeler danych pisanie i debugowanie niektórych obliczeń języka DAX może być trudne. Często zdarza się, że złożone wymagania dotyczące obliczeń często obejmują pisanie wyrażeń złożonych lub złożonych. Wyrażenia złożone mogą obejmować użycie wielu zagnieżdżonych funkcji i ewentualnie ponowne użycie logiki wyrażeń.

Używanie zmiennych w formułach języka DAX może pomóc w pisaniu bardziej złożonych i wydajnych obliczeń. Zmienne mogą zwiększyć wydajność, niezawodność, czytelność i zmniejszyć złożoność.

W tym artykule przedstawimy pierwsze trzy korzyści, korzystając z przykładowej miary wzrostu sprzedaży rok do roku (Rok do roku). (Formuła wzrostu sprzedaży rok do roku to sprzedaż w okresie, pomniejszona o sprzedaż w tym samym okresie ubiegłego roku, podzielona przez sprzedaż w tym samym okresie ubiegłego roku).

Zacznijmy od poniższej definicji miary.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

Miara generuje prawidłowy wynik, ale teraz zobaczmy, jak można ją ulepszyć.

Poprawa wydajności

Zwróć uwagę, że formuła powtarza wyrażenie, które oblicza "ten sam okres w zeszłym roku". Ta formuła jest nieefektywna, ponieważ wymaga, aby usługa Power BI dwukrotnie oszacowała to samo wyrażenie. Definicja miary może być wydajniejsza przy użyciu zmiennej VAR.

Poniższa definicja miary reprezentuje ulepszenie. Używa wyrażenia do przypisania wyniku "tego samego okresu ubiegłego roku" do zmiennej o nazwie SalesPriorYear. Zmienna jest następnie używana dwa razy w wyrażeniu RETURN.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

Miara nadal generuje prawidłowy wynik i robi to w około połowie czasu zapytania.

Zwiększanie czytelności

W poprzedniej definicji miary zwróć uwagę, jak wybór nazwy zmiennej sprawia, że wyrażenie RETURN jest prostsze do zrozumienia. Wyrażenie jest krótkie i samoopisujące.

Uproszczenie debugowania

Zmienne mogą również ułatwić debugowanie formuły. Aby przetestować wyrażenie przypisane do zmiennej, tymczasowo zapisz ponownie wyrażenie RETURN, aby wyświetlić zmienną.

Poniższa definicja miary zwraca tylko zmienną SalesPriorYear . Zwróć uwagę na sposób, w jaki komentarze są komentarzami dla zamierzonego wyrażenia RETURN. Ta technika umożliwia łatwe przywrócenie go po zakończeniu debugowania.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

Mniejsza złożoność

We wcześniejszych wersjach języka DAX zmienne nie były jeszcze obsługiwane. Wyrażenia złożone, które wprowadziły nowe konteksty filtru, były wymagane do używania funkcji EARLIER lub EARLIEST języka DAX do odwołowania się do kontekstów filtru zewnętrznego. Niestety, modelowanie danych stwierdziło, że te funkcje są trudne do zrozumienia i użycia.

Zmienne są zawsze oceniane poza filtrami, które ma zastosowanie wyrażenie RETURN. Z tego powodu, gdy używasz zmiennej w zmodyfikowanym kontekście filtru, osiąga taki sam wynik jak funkcja EARLIEST. W związku z tym można unikać używania funkcji EARLIER lub EARLIEST. Oznacza to, że można teraz pisać formuły, które są mniej złożone i które są łatwiejsze do zrozumienia.

Rozważmy następującą definicję kolumny obliczeniowej dodaną do tabeli Podkategorii . Ocenia ona klasyfikację dla każdej podkategorii produktów na podstawie wartości kolumny Subcategory Sales .

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

Funkcja EARLIER służy do odwoływania się do wartości kolumny Subcategory Sales w bieżącym kontekście wiersza.

Definicję kolumny obliczeniowej można ulepszyć przy użyciu zmiennej zamiast funkcji EARLIER. Zmienna CurrentSubcategorySales przechowuje wartość kolumny Subcategory Sales w bieżącym kontekście wiersza, a wyrażenie RETURN używa go w zmodyfikowanym kontekście filtru.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1