Het gebruik van FILTER voorkomen als filterargument

Als gegevensmodeller is het gebruikelijk dat u DAX-expressies schrijft die moeten worden geëvalueerd in een gewijzigde filtercontext. U kunt bijvoorbeeld een metingdefinitie schrijven om de verkoop te berekenen voor 'producten met hoge marge'. Deze berekening wordt verderop in dit artikel beschreven.

Notitie

Dit artikel is met name relevant voor modelberekeningen die filters toepassen op Import-tabellen.

De DAX-functies CALCULATE en CALCULATETABLE zijn belangrijke en nuttige functies. Hiermee kunt u berekeningen schrijven waarmee u filters verwijdert of toevoegt of relatiepaden wijzigt. Dit wordt gedaan door filterargumenten door te geven. Dit zijn Booleaanse expressies, tabelexpressies of speciale filterfuncties. In dit artikel worden alleen Booleaanse expressies en tabelexpressies besproken.

Bekijk de volgende metingsdefinitie, waarmee de verkoop van rode producten wordt berekend met behulp van een tabelexpressie. Hiermee worden alle filters vervangen die kunnen worden toegepast op de tabel Product .

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

De functie CALCULATE accepteert een tabelexpressie die wordt geretourneerd door de DAX-functie FILTER , waarmee de filterexpressie voor elke rij van de tabel Product wordt geëvalueerd. Het haalt het juiste resultaat op: het verkoopresultaat voor rode producten. Het kan echter veel efficiënter worden bereikt met behulp van een Boole-expressie.

Hier volgt een verbeterde metingsdefinitie, die gebruikmaakt van een Boole-expressie in plaats van de tabelexpressie. De DAX-functie KEEPFILTERS zorgt ervoor dat alle bestaande filters die op de kolom Kleur worden toegepast, behouden blijven en niet worden overschreven.

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

Het is raadzaam om waar mogelijk filterargumenten door te geven als Boole-expressies. Dit komt doordat modeltabellen importeren in het geheugen kolomarchieven zijn. Ze zijn expliciet geoptimaliseerd om op deze manier kolommen efficiënt te filteren.

Er zijn echter beperkingen die van toepassing zijn op Boole-expressies wanneer ze worden gebruikt als filterargumenten. Ze:

  • Kan niet verwijzen naar kolommen uit meerdere tabellen
  • Kan niet verwijzen naar een meting
  • Kan geneste CALCULATE-functies niet gebruiken
  • Kan geen functies gebruiken die een tabel scannen of retourneren

Dit betekent dat u tabelexpressies moet gebruiken voor complexere filtervereisten.

Overweeg nu een andere metingsdefinitie. De vereiste is om de verkoop te berekenen, maar alleen voor maanden die een winst hebben behaald.

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

In dit voorbeeld moet de functie FILTER worden gebruikt. Dit komt doordat het nodig is om de winstmeting te evalueren om die maanden te elimineren die geen winst behaalden. Het is niet mogelijk om een meting te gebruiken in een Boole-expressie wanneer deze wordt gebruikt als filterargument.

Aanbevelingen

Voor de beste prestaties is het raadzaam booleaanse expressies te gebruiken als filterargumenten, indien mogelijk.

Daarom mag de functie FILTER alleen worden gebruikt wanneer dat nodig is. U kunt deze gebruiken om complexe kolomvergelijkingen te filteren. Deze kolomvergelijkingen kunnen betrekking hebben op: