Del via


Unngå å bruke FILTER som filterargument

Som datamodellerer er det vanlig at du skriver DAX-uttrykk som må evalueres i en endret filterkontekst. Du kan for eksempel skrive en måldefinisjon for å beregne salg for produkter med høy margin. Vi vil beskrive denne beregningen senere i denne artikkelen.

Merk

Denne artikkelen er spesielt relevant for modellberegninger som bruker filtre på importtabeller.

FUNKSJONENE CALCULATE og CALCULATETABLE DAX er viktige og nyttige funksjoner. De lar deg skrive beregninger som fjerner eller legger til filtre, eller endrer relasjonsbaner. Det gjøres ved å sende inn filterargumenter, som enten er boolske uttrykk, tabelluttrykk eller spesielle filterfunksjoner. Vi diskuterer bare boolske uttrykk og tabelluttrykk i denne artikkelen.

Vurder følgende måldefinisjon, som beregner salg av røde produkter ved hjelp av et tabelluttrykk. Den erstatter alle filtre som kan brukes i produkttabellen.

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

CALCULATE-funksjonen godtar et tabelluttrykk som returneres av FILTER DAX-funksjonen, som evaluerer filteruttrykket for hver rad i produkttabellen. Det oppnår riktig resultat – salgsresultatet for røde produkter. Det kan imidlertid oppnås mye mer effektivt ved hjelp av et boolsk uttrykk.

Her er en forbedret måldefinisjon som bruker et boolsk uttrykk i stedet for tabelluttrykket. KEEPFILTERS DAX-funksjonen sikrer at eventuelle eksisterende filtre som brukes på Farge-kolonnen, bevares, og ikke overskrives.

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

Det anbefales at du sender filterargumenter som boolske uttrykk når det er mulig. Det er fordi importmodelltabeller er i minnekolonnelagre. De er eksplisitt optimalisert for effektivt å filtrere kolonner på denne måten.

Det finnes imidlertid begrensninger som gjelder for boolske uttrykk når de brukes som filterargumenter. De:

  • Kan ikke referere til kolonner fra flere tabeller
  • Kan ikke referere til et mål
  • Kan ikke bruke nestede CALCULATE-funksjoner
  • Kan ikke bruke funksjoner som skanner eller returnerer en tabell

Det betyr at du må bruke tabelluttrykk for mer komplekse filterkrav.

Vurder nå en annen måldefinisjon. Kravet er å beregne salg, men bare for måneder som har oppnådd fortjeneste.

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0
    )
)

I dette eksemplet må FILTER-funksjonen brukes. Det er fordi det krever evaluering av fortjenestemålet for å eliminere de månedene som ikke oppnådde fortjeneste. Det er ikke mulig å bruke et mål i et boolsk uttrykk når det brukes som filterargument.

Anbefalinger

For best ytelse anbefales det at du bruker boolske uttrykk som filterargumenter når det er mulig.

Filter-funksjonen bør derfor bare brukes når det er nødvendig. Du kan bruke den til å utføre filterkomplekse kolonnesammenligninger. Disse kolonnesammenligningene kan innebære: