Dela via


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

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

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

I den här artikeln visar vi de tre första fördelarna genom att använda ett exempelmått för försäljningstillväxt från år till år(år). (Formeln för försäljningstillväxt i år är periodförsäljning, minus försäljning för samma period förra året, dividerat med försäljning för samma period förra året.)

Vi börjar med följande måttdefinition.

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

Måttet ger rätt resultat, men nu ska vi se hur det kan förbättras.

Bättre prestanda

Observera att formeln upprepar uttrycket som beräknar "samma period förra året". Den här formeln är ineffektiv eftersom power BI måste utvärdera samma uttryck två gånger. Måttdefinitionen kan göras effektivare med hjälp av en variabel, VAR.

Följande måttdefinition representerar en förbättring. Det använder ett uttryck för att tilldela resultatet "samma period förra året" 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)

Måttet fortsätter att ge rätt resultat och gör det ungefär hälften av frågetiden.

Förbättra läsbarheten

I den föregående måttdefinitionen ser du hur valet av variabelnamn gör RETURN-uttrycket enklare att förstå. Uttrycket ä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 måttdefinition 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

Minskad komplexitet

I tidigare versioner av DAX stöds inte variabler ännu. Komplexa uttryck som introducerade nya filterkontexter krävdes för att använda DAX-funktionerna EARLIER eller EARLIEST för att referera till yttre filterkontexter. Datamodellerare tyckte tyvärr att dessa funktioner var svåra att förstå och använda.

Variabler utvärderas alltid utanför de filter som return-uttrycket gäller. Därför får du samma resultat som funktionen EARLIEST när du använder en variabel i en modifierad filterkontext. Därför kan du undvika att använda funktionerna EARLIER eller EARLIEST. Det innebär att du nu kan skriva formler som är mindre komplexa och som är lättare att förstå.

Överväg följande beräknade kolumndefinition som lagts till i tabellen Underkategori . Den utvärderar en rangordning för varje produktunderkategori baserat på kolumnvärdena För underkategoriförsäljning .

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

Funktionen EARLIER används för att referera till kolumnvärdet Underkategoriförsäljning i 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 kolumnvärdet Underkategoriförsäljning i den aktuella radkontexten och RETURN-uttrycket använder det i en modifierad filterkontext.

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