Brug variabler til at forbedre dine DAX-formler

Som dataudformer kan det være en udfordring at skrive og foretage fejlfinding af nogle DAX-beregninger. Det er almindeligt, at komplekse beregningskrav ofte involverer skrivning af sammensatte eller komplekse udtryk. Sammensatte udtryk kan involvere brugen af mange indlejrede funktioner og muligvis genbrug af udtrykslogik.

Brug af variabler i dine DAX-formler kan hjælpe dig med at skrive mere komplekse og effektive beregninger. Variabler kan forbedre ydeevnen, pålideligheden, læsbarheden og reducere kompleksiteten.

I denne artikel demonstrerer vi de første tre fordele ved at bruge en eksempelmåling for salgsvækst år for år (YoY). Formlen for salgsvæksten åå er periodesalg minus salg for samme periode sidste år divideret med salg for samme periode sidste år.

Lad os starte med følgende målingsdefinition.

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

Målingen giver det korrekte resultat, men lad os nu se, hvordan den kan forbedres.

Gør ydeevnen bedre

Bemærk, at formlen gentager det udtryk, der beregner "samme periode sidste år". Denne formel er ineffektiv, da den kræver, at Power BI evaluerer det samme udtryk to gange. Målingsdefinitionen kan gøres mere effektiv ved hjælp af en variabel, VAR.

Følgende målingsdefinition repræsenterer en forbedring. Det bruger et udtryk til at tildele resultatet "samme periode sidste år" til en variabel med navnet SalesPriorYear. Variablen bruges derefter to gange i return-udtrykket.

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

Målingen giver fortsat det korrekte resultat og gør det om ca. halvdelen af forespørgselstiden.

Gør læsbarheden bedre

I den forrige målingsdefinition kan du se, hvordan valget af variabelnavn gør det nemmere at forstå returneringsudtrykket. Udtrykket er kort og selvbeskrivende.

Gør fejlfindingen enklere

Variabler kan også hjælpe dig med at foretage fejlfinding af en formel. Hvis du vil teste et udtryk, der er tildelt en variabel, skal du midlertidigt omskrive returneringsudtrykket for at skrive variablen.

Følgende målingsdefinition returnerer kun variablen SalesPriorYear . Bemærk, hvordan den kommenterer det tiltænkte RETURN-udtryk. Denne teknik giver dig mulighed for nemt at gendanne den, når fejlfindingen er fuldført.

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

Reducer kompleksiteten

I tidligere versioner af DAX understøttes variabler endnu ikke. Komplekse udtryk, der introducerede nye filterkontekster, var påkrævet for at bruge DAX-funktionerne EARLIER eller EARLIEST til at referere til ydre filterkontekster. Desværre fandt dataudformere disse funktioner svære at forstå og bruge.

Variabler evalueres altid uden for de filtre, som dit RETURN-udtryk gælder for. Når du derfor bruger en variabel i en ændret filterkontekst, opnår den det samme resultat som funktionen EARLIEST. Brugen af funktionerne EARLIER eller EARLIEST kan derfor undgås. Det betyder, at du nu kan skrive formler, der er mindre komplekse, og som er nemmere at forstå.

Overvej følgende definition af den beregnede kolonne, der er føjet til tabellen Subcategory . Den evaluerer en rangering for hver produktunderkategori baseret på kolonneværdierne for Underkategorisalg .

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

Funktionen EARLIER bruges til at referere til kolonneværdien Subcategory Sales i den aktuelle rækkekontekst.

Definitionen af den beregnede kolonne kan forbedres ved hjælp af en variabel i stedet for funktionen EARLIER. Variablen CurrentSubcategorySales gemmer kolonneværdien Subcategory Sales i den aktuelle rækkekontekst, og returneringsudtrykket bruger den i en ændret filterkontekst.

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