Bruke variabler til å forbedre DAX-formlene

Det kan være utfordrende å skrive og feilsøke noen DAX-beregninger som datamodellerer. Det er vanlig at komplekse beregningskrav ofte innebærer å skrive sammensatte eller komplekse uttrykk. Sammensatte uttrykk kan innebære bruk av mange nestede funksjoner, og muligens gjenbruk av uttrykkslogikk.

Bruk av variabler i DAX-formlene kan hjelpe deg med å skrive mer komplekse og effektive beregninger. Variabler kan forbedre ytelsen, påliteligheten, lesbarheten og redusere kompleksiteten.

I denne artikkelen skal vi demonstrere de tre første fordelene ved å bruke et eksempelmål for salgsvekst fra år til år (YoY). (Formelen for Salgsvekst i År er periodesalg, minus salg for samme periode i fjor, dividert med salg for samme periode i fjor.)

La oss starte med følgende måldefinisjon.

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

Målet gir riktig resultat, men la oss nå se hvordan det kan forbedres.

Forbedre ytelsen

Legg merke til at formelen gjentar uttrykket som beregner «samme periode i fjor». Denne formelen er ineffektiv, da den krever at Power BI evaluerer det samme uttrykket to ganger. Måldefinisjonen kan gjøres mer effektiv ved hjelp av en variabel, VARIANS.

Følgende måldefinisjon representerer en forbedring. Den bruker et uttrykk til å tilordne resultatet «samme periode i fjor» til en variabel kalt SalesPriorYear. Variabelen brukes deretter to ganger i RETURN-uttrykket.

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

Målet fortsetter å produsere det riktige resultatet, og gjør det i omtrent halvparten av spørringstiden.

Forbedre lesbarheten

Legg merke til hvordan valget av variabelnavn gjør RETUR-uttrykket enklere å forstå i den forrige måldefinisjonen. Uttrykket er kort og selvbeskrivende.

Forenkle feilsøking

Variabler kan også hjelpe deg med å feilsøke en formel. Hvis du vil teste et uttrykk som er tilordnet en variabel, skriver du om RETURN-uttrykket midlertidig for å sende variabelen.

Følgende måldefinisjon returnerer bare SalesPriorYear-variabelen . Legg merke til hvordan det kommenterer det tiltenkte RETURN-uttrykket. Med denne teknikken kan du enkelt tilbakestille den når feilsøkingen er fullført.

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

Reduser kompleksiteten

I tidligere versjoner av DAX støttes ikke variabler ennå. Komplekse uttrykk som introduserte nye filterkontekster, var nødvendige for å bruke DAX-funksjonene EARLIER eller EARLIEST til å referere til ytre filterkontekster. Dessverre fant datamodellerere disse funksjonene vanskelige å forstå og bruke.

Variabler evalueres alltid utenfor filtrene som RETURN-uttrykket gjelder for. Derfor oppnår den samme resultatet som EARLIEST-funksjonen når du bruker en variabel i en endret filterkontekst. Bruk av funksjonene EARLIER eller EARLIEST kan derfor unngås. Det betyr at du nå kan skrive formler som er mindre komplekse, og som er enklere å forstå.

Vurder følgende beregnede kolonnedefinisjon som er lagt til i underkategoritabellen. Den evaluerer en rangering for hver produktunderkategori basert på kolonneverdiene for underkategorisalg .

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

EARLIER-funksjonen brukes til å referere til kolonneverdien Underkategori salg i gjeldende radkontekst.

Den beregnede kolonnedefinisjonen kan forbedres ved hjelp av en variabel i stedet for EARLIER-funksjonen. CurrentSubcategorySales-variabelen lagrer kolonneverdien Subcategory Sales i gjeldende radkontekst, og RETURN-uttrykket bruker den i en endret filterkontekst.

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