Del via


Brug variabler til at forbedre dine DAX formler

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

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

I denne artikel demonstrerer vi de first tre fordele ved at bruge et eksempel measure for year–over-year (YoY) salgsvækst. Formlen for salgsvæksten åå er periodesalg minus salg for den samme periode lastyeardivideret med salg for samme periode lastyear.)

Lad os starte med følgende measure definition.

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

measure giver det korrekte resultat, men lad os now se, hvordan det kan forbedres.

Øg ydeevnen

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

Følgende measure definition repræsenterer en forbedring. Det bruger et udtryk til at tildele resultatet "samme periode lastyear" 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)

measure giver fortsat det korrekte resultat, and gør det i ca. halvdelen af forespørgslen time.

Gør læsbarheden bedre

I definitionen previousmeasure kan du se, hvordan valget af variabelnavn gør det nemmere at forstå returneringsudtrykket. Udtrykket er kort and 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 measure definition 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 earlier versioner af DAXunderstøttes variabler not endnu. Komplekse udtryk, der introducerede nye filter kontekster, skulle bruge EARLIERorEARLIESTDAX-funktionerne til at referere til ydre filter kontekster. Desværre fandt dataudformere disse funktioner svære at forstå and brug.

Variabler evalueres altid uden for filters returneringsudtrykket gælder. Når du derfor bruger en variabel i en ændret filter kontekst, opnår den det samme resultat som funktionen EARLIEST. Brugen af de EARLIERorEARLIEST funktioner kan derfor undgås. Det betyder, at du kan now skrive formler, der er mindre komplekse, and, der er nemmere at forstå.

Overvej følgende definition af den beregnede kolonne, der er føjet til tabellen Underkategori. Den evaluerer en rank for hver product underkategori baseret på kolonnen Underkategori salgvalues.

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

Funktionen EARLIER bruges til at referere til kolonnen Underkategori salesvaluei 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 kolonnen Subcategory Salesvaluei den aktuelle rækkekontekst, and returneringsudtrykket bruger det i en ændret filter kontekst.

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