Delen via


Vermijd het gebruik van FILTER als een filter argument

Als gegevensmodeller is het gebruikelijk dat u DAX expressies schrijft die moeten worden geëvalueerd in een gewijzigde filter context. U kunt bijvoorbeeld een measure definitie schrijven voor de verkoop te calculate 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 importtabellen.

De CALCULATEandCALCULATETABLEDAX functies zijn belangrijk and nuttige functies. Hiermee kunt u berekeningen schrijven die or verwijderen, filterstoevoegen en de relatiepaden van or wijzigen. Dit wordt gedaan door filter argumenten door te geven. Dit zijn Booleaanse expressies, tabelexpressies or speciale filter functies. In dit artikel bespreken we alleen Booleaanse and tabelexpressies.

Bekijk de volgende measure definitie, waarmee de rode product verkoop wordt berekend met behulp van een tabelexpressie. Het zal replace alle filters die op de Product tabel kunnen worden toegepast.

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

De functie CALCULATE accepteert een tabelexpressie die wordt geretourneerd door de FILTERDAX functie, waarmee de filter expressie voor elke rij van de Product tabel 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 measure definitie, die gebruikmaakt van een Boole-expressie in plaats van de tabelexpressie. De functie KEEPFILTERSDAX zorgt ervoor dat eventuele bestaande filters die zijn toegepast op de kolom Kleur zullen behouden blijven, andnot overschreven.

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

U wordt aangeraden filter argumenten door te geven als Boole-expressies, indien mogelijk. Dit komt doordat modeltabellen importeren in het geheugen kolomarchieven zijn. Ze zijn expliciet geoptimaliseerd om op deze manier efficiënt kolommen te filter.

Er zijn echter beperkingen die van toepassing zijn op Boole-expressies wanneer ze worden gebruikt als filter argumenten. Zij:

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

Dit betekent dat u tabelexpressies moet gebruiken voor complexere vereisten voor filter.

Beschouw now als een andere definitie van measure. Er is de vereiste om calculate verkopen te realiseren, maar alleen voor maanden die 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 omdat het nodig is om de Profit-measure te evalueren om die maanden te elimineren die geen winst behaalden. Het is not mogelijk om een measure te gebruiken in een booleaanse expressie wanneer deze als filter-argument wordt gebruikt.

Aanbevelingen

Voor de beste prestaties wordt u aangeraden booleaanse expressies te gebruiken als filter argumenten, indien mogelijk.

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

  • Maatregelen
  • Andere kolommen
  • Gebruik de functie ORDAXor de logische operator OR (||)