DAX: Verschil tussen FILTER en CALCULATETABLE

Home Power BI DAX DAX: Verschil tussen FILTER en CALCULATETABLE

In de wereld van DAX formules, zijn de twee formules die het meest door elkaar gehaald worden FILTER en CALCULATETABLE. Dat is te wijten aan het feit dat zij in bepaalde scenario’s eigenlijk hetzelfde resultaat opleveren. Bijvoorbeeld, wanneer een Matrix op het canvas wordt aangemaakt waarin een filter wordt toegepast op één dimensie tabel (in dit geval door het toe te voegen aan de rijen van deze Matrix) en de filter in de DAX formule wordt toegepast op een andere dimensie tabel.

Beschouw deze twee formules:

 

1.1 Count Sales Product A FILTER =

COUNTROWS (

    FILTER (

        fact_Sales,

        RELATED ( dim_Products[Productkey] ) = “Product A”

    )

)

 

1.2 Count Sales Product A CALCULATETABLE =

COUNTROWS (

    CALCULATETABLE (

        fact_Sales,

        dim_Products[Productkey] = “Product A”

    )

)

 

De syntaxis is eigenlijk vergelijkbaar, en dat geldt ook voor de resultaten wanneer die in deze Matrix worden toegepast:

De engine heeft deze twee formules echter op een andere manier geëvalueerd. 1.1 wordt uitgevoerd in een geneste rijcontext (waarin wordt voorzien door de FILTER-formule) binnen een filtercontext (waarin wordt voorzien door de measure).  

1.2 wordt echter uitgevoerd binnen een gewijzigde filtercontext, omdat het filter in het CALCULATETABLE-instructie wordt toegevoegd aan de initiële filtercontext die alleen wordt gevuld door de maandnaam die uit de rijkop komt. Als je niet zeker bent van rij- en filtercontext, bekijk dan zeker mijn video’s over deze concepten.

Laten we nu eens kijken wanneer FILTER en CALCULATETABLE beginnen af te wijken.

Overweeg deze formules:

 

2.1 Count Sales March FILTER =

COUNTROWS (

    FILTER (

        fact_Sales,

        RELATED ( ‘Calendar'[Monthname] ) = “March” && 

            RELATED (‘Calendar'[Month] ) = 3

    )

)

 

2.2 Count Sales March CALCULATETABLE =

COUNTROWS (

    CALCULATETABLE (

        fact_Sales,

        ‘Calendar'[Monthname] = “March”,

        ‘Calendar'[Month] = 3

    )

)

 

2.1 filtert eenvoudigweg de verkooptabel op alleen maart, dus als een filter uit de rij koptekst op een andere maand valt, wordt een filter toegepast op die andere maand en op maart, wat resulteert in een blanco resultaat.

2.2 daarentegen overschrijft de maandnaam die uit de rij koptekst komt in de filter context, dus het zal altijd de waarde voor maart teruggeven, ongeacht de waarde in de rij koptekst.

En laten we nu eens kijken naar een meer diepgaand verschil tussen de twee. Nogmaals, bekijk deze formules:

 

3.1 Count Sales Previous Month FILTER =

COUNTROWS (

    FILTER (

        fact_Sales,

        PREVIOUSMONTH ( ‘Calendar'[Date] )

    )

)

 

3.2 Count Sales Previous Month CALCULATETABLE =

COUNTROWS (

    CALCULATETABLE (

        fact_Sales,

        PREVIOUSMONTH ( ‘Calendar'[Date] )

    )

)

 

Aangezien CALCULATETABLE wordt gebruikt in 3.2, kan de initiële filtercontext worden overschreven door wat is opgegeven in het filterstatement, dus: PREVIOUSMONTH ( ‘Kalender'[Datum] ). In deze formule zorgt DAX ervoor dat de maandnaam in de initiële filtercontext wordt overschreven door de maand die er vóór staat.

FILTER is unable of overwriting the initial filter context so trying that would give an error.

Het laatste, maar zeker niet het minste verschil is het feit dat CALCULATETABLE, net als CALCULATE, een context-overgang veroorzaakt. Dus, als een formule initieel geëvalueerd wordt binnen rij context, zal die rij context omgezet worden in een filter context. Om dit gedrag te laten zien, werken berekende kolommen goed omdat de evaluatie context van een berekende kolom rij context is. Beschouw deze 2 kolommen die we zullen toevoegen aan de dimensie Clients tabel:

 

4.1 Column Count Sales Product A FILTER =

COUNTROWS (

    FILTER (

        fact_Sales,

        RELATED ( dim_Products[Productkey] ) = “Product A”

    )

)

 

4.2 Column Count Sales Product A CALCULATETABLE =

COUNTROWS (

    CALCULATETABLE (

        fact_Sales,

        dim_Products[Productkey] = “Product A”

    )

)

 

4.1 zal geen enkele context overgang uitvoeren, de evaluatie context blijft rij context. Rij context filtert niet. Ik herhaal: rij context filtert niet. Dus we krijgen gewoon een telling van alle Product A verkopen terug, voor alle klanten.

 

4.2, echter, zal de context overgang uitvoeren. Dus eerst wordt een filter op de klant in het datamodel toegepast en daarna wordt de evaluatie van de formule gedaan. Daarom zal dit resulteren in de telling van product A per klant.

Wilt u een Power BI Pro worden? Minova biedt Power BI incompany trainingen aan voor alle niveaus, van beginner tot gevorderde. Kijk op de trainingspagina voor meer informatie