Dela via


Använd variabler för att förbättra dina DAX formler

Som datamodellerare kan det vara svårt att skriva and att felsöka vissa DAX beräkningar. Det är vanligt att komplexa beräkningskrav ofta omfattar att skriva sammansatta or komplexa uttryck. Sammansatta uttryck kan omfatta användning av många kapslade funktioner, and eventuellt återanvändning av uttryckslogik.

Med hjälp av variabler i dina DAX formler kan du skriva mer komplexa and effektiva beräkningar. Variabler kan förbättra prestanda, tillförlitlighet, läsbarhet and minska komplexiteten.

I den här artikeln visar vi first tre fördelar genom att använda ett exempel measure för year-over-year (YoY) försäljningstillväxt. (Formeln för försäljningstillväxt i år är periodförsäljning, minus försäljning för samma period lastyear, dividerat med försäljning för samma period lastyear.)

Vi börjar med följande measure definition.

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

measure ger rätt resultat, men låt oss now se hur det kan förbättras.

Förbättra prestanda

Observera att formeln upprepar uttrycket som beräknar "samma period lastyear". Den här formeln är ineffektiv eftersom den kräver Power BI för att evaluate samma uttryck två gånger. Den measure definitionen kan göras mer effektiv med hjälp av en variabel, VAR.

Följande measure definition representerar en förbättring. Det använder ett uttryck för att tilldela resultatet "samma period lastyear" till en variabel med namnet SalesPriorYear. Variabeln används sedan två gånger i RETURN-uttrycket.

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

measure fortsätter att ge rätt resultat, and gör det i ungefär hälften av frågan time.

Förbättra läsbarheten

I definitionen previousmeasure ser du hur valet av variabelnamn gör RETURN-uttrycket enklare att förstå. Uttrycket and är kort och självbeskrivande.

Förenkla felsökning

Variabler kan också hjälpa dig att felsöka en formel. Om du vill testa ett uttryck som tilldelats en variabel skriver du tillfälligt om RETURN-uttrycket för att mata ut variabeln.

Följande measure definition returnerar endast variabeln SalesPriorYear. Observera hur det kommenterar ut det avsedda RETURN-uttrycket. Med den här tekniken kan du enkelt återställa den när felsökningen är klar.

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

Minska komplexiteten

I earlier versioner av DAXstöds variabler not ännu. Komplexa uttryck som introducerade nya filter kontexter krävdes för att använda EARLIERorEARLIESTDAX-funktionerna för att referera till yttre filter kontexter. Datamodellerare tyckte tyvärr att dessa funktioner var svåra att förstå and användning.

Variabler utvärderas alltid utanför filters ditt RETURN-uttryck gäller. Därför får du samma resultat som funktionen EARLIEST när du använder en variabel i en modifierad filter kontext. Du kan därför undvika att använda EARLIERorEARLIEST funktioner. Det innebär att du kan now skriva formler som är mindre komplexa, and som är lättare att förstå.

Överväg följande beräknade kolumndefinition som lagts till i tabellen underkategori. Den utvärderar en rank för varje product underkategori baserat på kolumnen Underkategoriförsäljningvalues.

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

Funktionen EARLIER används för att referera till kolumnen underkategoriförsäljningvaluei den aktuella radkontexten.

Den beräknade kolumndefinitionen kan förbättras med hjälp av en variabel i stället för funktionen EARLIER. Variabeln CurrentSubcategorySales lagrar kolumnen Underkategoriförsäljningvaluei den aktuella radkontexten, and return-uttrycket använder den i en modifierad filter kontext.

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