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.

Notat

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

Funksjonene CALCULATE og CALCULATETABLEDAX 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 tabellen Produkt.

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

Funksjonen CALCULATE godtar et tabelluttrykk som returneres av FILTERDAX-funksjonen, som evaluerer filteruttrykket for hver rad i tabellen Product. 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. Funksjonen KEEPFILTERSDAX 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 Profit mål for å eliminere de månedene som ikke oppnådde en 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.

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

  • Tiltak
  • Andre kolonner
  • Bruke ORDAX-funksjonen eller den OR logiske operatoren (||)