Udostępnij za pośrednictwem


Ulepszanie formuł DAX za pomocą zmiennych

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

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

W tym artykule przedstawimy first trzy korzyści, na przykładzie measure dla wzrostu sprzedaży year-over-year (YoY). (Formuła wzrostu sprzedaży rok do roku to sprzedaż w okresie, pomniejszona o sprzedaż w tym samym okresie lastyear, podzielona przez sprzedaż w tym samym okresie lastyear).

Zacznijmy od poniższej definicji measure.

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

measure generuje prawidłowy wynik, jednak now zobaczmy, jak można go ulepszyć.

Zwiększanie wydajności

Zwróć uwagę, że formuła powtarza wyrażenie, które oblicza "ten sam okres lastyear". Ta formuła jest nieefektywna, ponieważ wymaga Power BI, aby evaluate to samo wyrażenie dwa razy. Definicja measure może być wydajniejsza przy użyciu zmiennej VAR.

Poniższa definicja measure reprezentuje poprawę. Używa wyrażenia , aby przypisać wynik "tego samego okresu lastyear" 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)

measure nadal generuje prawidłowy wynik, and robi to w około połowie zapytania time.

Zwiększanie czytelności

W definicji previousmeasure zwróć uwagę, jak wybór nazwy zmiennej sprawia, że wyrażenie RETURN jest prostsze do zrozumienia. Wyrażenie jest krótkie and 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 measure zwraca tylko zmienną SalesPriorYear. Zwróć uwagę, jak zakomentowane jest zamierzone wyrażenie 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

Zmniejszanie złożoności

W wersjach earlierDAXzmienne były obsługiwane jeszcze not. Wymagane były wyrażenia złożone, które wprowadzały nowe konteksty filter, aby używać funkcji EARLIERorEARLIESTDAX do odwoływania się do zewnętrznych kontekstów filter. Niestety, modelowanie danych stwierdziło, że te funkcje są trudne do zrozumienia and użycia.

Zmienne są zawsze oceniane poza wyrażeniem RETURN, do którego odnosi się filters. Z tego powodu, gdy używasz zmiennej w zmodyfikowanym kontekście filter, osiąga ten sam wynik co funkcja EARLIEST. W związku z tym można unikać używania funkcji EARLIERorEARLIEST. Oznacza to, że można now pisać formuły, które są mniej złożone, and, które są łatwiejsze do zrozumienia.

Rozważmy następującą definicję kolumny obliczeniowej dodaną do tabeli podkategorii . Ocenia rank dla każdej podkategorii product na podstawie kolumny sprzedaży podkategorii values.

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

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

Definicję kolumny obliczeniowej można poprawić przy użyciu zmiennej zamiast funkcji EARLIER. Zmienna CurrentSubcategorySales przechowuje kolumnę Podkategoria Salesvaluew bieżącym kontekście wiersza, and wyrażenie RETURN używa go w zmodyfikowanym kontekście filter.

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