Home Onze Technologieën Microsoft Power Platform API-koppelingen Diensten · Maatwerk Blogs Over Plan kennismaking

Row context en filter context in DAX uitgelegd

← Alle blogs
Power BI · 10 min leestijd

Row context en filter context in DAX uitgelegd

Maarten
Eigenaar Fluentics
Illustratie van row context en filter context: een tabel met een gemarkeerde rij naast een filter dat rijen selecteert

Het verschil tussen row context en filter context in één zin: row context weet op welke rij je staat, filter context bepaalt welke rijen je überhaupt ziet. Een calculated column rekent rij voor rij (row context), een measure rekent over alle rijen die na het filteren overblijven (filter context). Snap je die twee, dan snap je waarom dezelfde DAX-formule op de ene plek 200 oplevert en op de andere plek 3.570.

Bijna iedereen die met DAX begint, loopt hier tegenaan. Je schrijft een formule die logisch lijkt, en Power BI geeft een foutmelding of een totaal dat nergens op slaat. Microsoft noemt context in de DAX-documentatie niet voor niets een van de belangrijkste begrippen om te begrijpen. In deze handleiding leggen we het stap voor stap uit, met één klein voorbeeld dat we het hele artikel blijven gebruiken. De opbouw volgt de uitleg van SQLBI, de bekendste DAX-experts ter wereld, maar dan in gewone taal.

Het voorbeeld: een fietsenwinkel met zes orders

We gebruiken de tabel Verkoop van een fietsenwinkel met twee filialen, Noord en Zuid. Zes orders, meer niet. Klein genoeg om alles uit je hoofd na te rekenen.

OrderProductRegioAantalPrijs
1StadsfietsNoord2450
2StadsfietsZuid1450
3HelmNoord540
4HelmZuid340
5E-bikeNoord11.800
6FietsslotZuid425

Daarnaast is er een tabel Product met de vier producten en hun categorie (Fiets of Accessoire). Die is via de kolom Product gekoppeld aan de tabel Verkoop. Die koppeling hebben we later nodig.

Wat is context eigenlijk?

Een DAX-formule rekent nooit in het luchtledige. Ze rekent altijd binnen een bepaalde situatie: welke rij bekijk ik, en welke rijen doen mee? Die situatie heet de evaluation context. Daarom kan precies dezelfde formule in elke cel van een tabel een ander getal opleveren.

Een beeld dat helpt: denk aan een stapel kassabonnen op je bureau.

  • Filter context is de vraag welke bonnen er op tafel liggen. Heb je alleen de bonnen van filiaal Noord gepakt, dan tel je alleen die op.
  • Row context is je vinger bij één regel op één bon. Op die regel kun je aantal keer prijs uitrekenen, want je weet precies welke regel je bedoelt.

Houd dat beeld vast, we komen er steeds op terug.

Wat is row context?

Row context betekent simpelweg: de huidige rij. DAX weet op dat moment bij welke rij het is en kan dus de waarden uit die rij gebruiken. Het duidelijkste voorbeeld is een calculated column, een kolom die je zelf aan een tabel toevoegt. In Power BI Desktop klik je daarvoor met de rechtermuisknop op de tabel Verkoop in het venster Data en kies je New column.

Omzet = Verkoop[Aantal] * Verkoop[Prijs]

Power BI voert deze formule voor elke rij apart uit. Bij order 3 staat de vinger op de helmen in Noord: 5 keer 40 is 200. Daarna schuift de vinger een rij op, en zo verder tot onderaan de tabel.

Schema van row context: DAX rekent rij voor rij, bij order 3 is de omzet 5 keer 40 is 200
Row context: de formule kijkt steeds naar één rij en schuift dan door naar de volgende.

Waar ontstaat row context?

  • In calculated columns. Elke rij krijgt automatisch een eigen row context.
  • In iterators. Dat zijn functies die een tabel rij voor rij doorlopen, zoals SUMX, AVERAGEX en MAXX, maar ook FILTER en ADDCOLUMNS. Ze maken voor elke rij een row context aan.

Twee dingen die row context niet doet

Row context filtert niet. Dit is de grootste valkuil. Je vinger staat op één regel, maar alle bonnen liggen nog op tafel. Schrijf je in een calculated column SUM ( Verkoop[Aantal] ), dan krijg je op elke rij 16: het totaal van alle orders. De row context zegt welke rij je bekijkt, niet welke rijen meetellen.

Row context volgt geen relaties. Wil je vanuit de tabel Verkoop de categorie uit de tabel Product ophalen, dan moet je daar expliciet om vragen met RELATED:

Categorie = RELATED ( Product[Categorie] )

Wat is filter context?

Filter context is de verzameling filters die bepaalt welke rijen zichtbaar zijn op het moment dat een formule rekent. Microsoft omschrijft het als “the set of values allowed in each column”. Het werkt zoals het filterknopje in Excel: je vinkt Noord aan, en de rijen van Zuid verdwijnen even uit beeld.

Filter context hoort bij measures: berekeningen die je maakt via New measure en die pas rekenen als ze in een visual staan. Neem deze measure:

Totale omzet = SUMX ( Verkoop, Verkoop[Aantal] * Verkoop[Prijs] )

Zet je Regio in een matrix met deze measure ernaast, dan gebeurt er per cel iets anders. In de cel Noord zijn alleen de drie orders van Noord zichtbaar, dus de uitkomst is 2.900. In de cel Zuid zie je alleen Zuid: 670. In de totaalregel staat geen filter op regio, dus tellen alle zes orders mee: 3.570. Eén formule, drie antwoorden.

Schema van filter context: de cel Noord in een matrix filtert de tabel Verkoop tot drie rijen met samen 2.900 omzet
Filter context: elke cel in de matrix bepaalt welke rijen zichtbaar zijn voordat de measure rekent.

Waar komt filter context vandaan?

  • Rijen en kolommen van een visual: elke cel in een matrix is een eigen combinatie van filters
  • Slicers en het venster Filters
  • Cross-filtering: je klikt op een balk in de ene grafiek en de rest van de pagina filtert mee
  • Relaties: een filter op de tabel Product werkt automatisch door naar de tabel Verkoop
  • CALCULATE en CALCULATETABLE in je eigen formule

Filters op verschillende kolommen werken samen als een EN. Staat er een filter op Regio = Noord én op Product = Helm, dan blijft alleen order 3 over.

Wat is het verschil tussen row context en filter context?

Naast elkaar gezet:

Row contextFilter context
Vraag die het beantwoordtOp welke rij sta ik?Welke rijen doen mee?
Waar je het tegenkomtCalculated columns en iterators (SUMX, FILTER)Measures in visuals, slicers, filters, CALCULATE
Filtert het de data?NeeJa
Volgt het relaties?Nee, gebruik RELATED of RELATEDTABLEJa, automatisch via de relatie
Kassabon-beeldJe vinger bij één regelWelke bonnen op tafel liggen

Waarom geeft mijn measure een foutmelding?

Probeer de formule van de calculated column eens als measure:

Omzet measure = Verkoop[Aantal] * Verkoop[Prijs]

Power BI antwoordt met: A single value for column ‘Aantal’ in table ‘Verkoop’ cannot be determined.

Logisch als je aan de kassabonnen denkt. Een measure heeft alleen een filter context: er liggen bonnen op tafel, maar je vinger staat nergens. Welk aantal bedoel je dan? Dat van order 1? Van order 5? DAX weet het niet en weigert. Een measure moet daarom altijd samenvatten, met een aggregatie als SUM of met een iterator als SUMX die zelf de vinger langs alle regels laat lopen.

SUM of SUMX: waar het vaak misgaat

De eerste reflex na die foutmelding is vaak dit:

Omzet fout = SUM ( Verkoop[Aantal] ) * SUM ( Verkoop[Prijs] )

Geen foutmelding meer, maar de uitkomst is 44.880. Dat is 16 stuks keer 2.805 euro aan opgetelde prijzen: je vermenigvuldigt twee totalen die niets met elkaar te maken hebben. De echte omzet is 3.570.

SUMX doet het wel goed. Het maakt voor elke zichtbare rij een row context aan, rekent daar aantal keer prijs uit en telt pas daarna op: 900 + 450 + 200 + 120 + 1.800 + 100 = 3.570.

Vergelijking SUM keer SUM geeft 44.880 en SUMX per rij geeft de juiste omzet van 3.570
Eerst totalen vermenigvuldigen (links) of eerst per rij rekenen (rechts): alleen de rechterkant klopt.

De vuistregel: moet je per rij iets uitrekenen voordat je optelt, gebruik dan een iterator zoals SUMX. Tel je alleen één kolom op, dan volstaat SUM. Meer van dit soort functies vind je in onze DAX cheat sheet.

Zo werken ze samen in één measure

In de praktijk zijn beide contexts bijna altijd tegelijk actief. Neem de measure Totale omzet in de cel Noord:

  1. Eerst de filter context. De matrix zet een filter op Regio = Noord. Van de zes orders blijven er drie zichtbaar.
  2. Dan de row context. SUMX loopt die drie rijen één voor één langs en rekent per rij aantal keer prijs: 900, 200 en 1.800.
  3. Dan optellen. SUMX telt de drie uitkomsten op: 2.900.
Stappenschema: filter context selecteert de orders van Noord, row context rekent per rij, samen 2.900
Eerst bepaalt de filter context welke rijen meedoen, daarna rekent de row context per rij.

Microsoft zegt het in de DAX-basisuitleg voor Power BI Desktop zo: filter context komt niet in plaats van row context, maar werkt er bovenop.

De volgende stap: CALCULATE en context transition

Met CALCULATE pas je zelf de filter context aan. Deze measure toont altijd de omzet van Noord, ook in de regel van Zuid, omdat CALCULATE het filter op Regio overschrijft:

Omzet Noord = CALCULATE ( [Totale omzet], Verkoop[Regio] = "Noord" )

CALCULATE heeft nog een tweede, minder bekende eigenschap: het zet een row context om in een filter context. Dat heet context transition. Bekijk deze twee calculated columns in de tabel Product:

Verkocht zonder CALCULATE = SUM ( Verkoop[Aantal] )
Verkocht met CALCULATE = CALCULATE ( SUM ( Verkoop[Aantal] ) )
ProductVerkocht zonder CALCULATEVerkocht met CALCULATE
Stadsfiets163
Helm168
E-bike161
Fietsslot164

De eerste kolom geeft op elke rij 16, want row context filtert niet. De tweede geeft per product het juiste aantal. CALCULATE maakt van “ik sta op de rij Helm” het filter Product = Helm, en dat filter loopt via de relatie door naar de tabel Verkoop.

Let op: verwijs je in een formule naar een measure, dan zet DAX daar automatisch een onzichtbare CALCULATE omheen. Een measure binnen een calculated column of binnen SUMX veroorzaakt dus altijd context transition. Handig, maar ook een bron van verrassende uitkomsten en trage rapporten bij grote tabellen. Wil je hier dieper in duiken, lees dan de uitleg over context transition van SQLBI.

Checklist: welke context heb ik hier?

Klopt een uitkomst niet, loop dan deze vier vragen langs:

  1. Schrijf ik een calculated column of een measure? Een column heeft row context, een measure filter context.
  2. Welke filters staan er op deze cel? Kijk naar de rijen en kolommen van de visual, slicers, het venster Filters en andere visuals op de pagina.
  3. Zit er een iterator in mijn formule? Dan ontstaat er binnen die functie een row context per rij.
  4. Zit er een CALCULATE in, of verwijs ik naar een measure? Dan worden filters aangepast of vindt er context transition plaats.

Krijg je je Power BI-model toch niet kloppend? Onze Power BI-specialisten kijken graag met je mee. Neem contact met ons op.

Veelgestelde vragen

Heeft een measure ooit een row context?

Niet vanzelf. Een measure start alleen met een filter context. Gebruik je in de measure een iterator zoals SUMX of FILTER, dan ontstaat er binnen die functie wel een row context.

Heeft een calculated column een filter context?

Bij het berekenen van een calculated column zijn er geen filters actief, ook niet van slicers in je rapport. Calculated columns worden berekend als het model ververst, niet als je in het rapport klikt. Wil je toch filteren op de huidige rij, gebruik dan CALCULATE voor context transition.

Wanneer kies ik een calculated column en wanneer een measure?

Een calculated column gebruik je voor een vaste eigenschap per rij waarop je wilt filteren of groeperen, zoals een prijscategorie. Een measure gebruik je voor getallen die moeten meebewegen met filters en slicers, zoals omzet of marge. Twijfel je, kies dan een measure.

Wat is het verschil tussen filter context en query context?

In oudere Microsoft-documentatie kom je ook de term query context tegen: de filters die uit de visual zelf komen, zoals rijen, kolommen en slicers. In de praktijk valt dat onder filter context. De meeste moderne uitleg, ook die van SQLBI, gebruikt alleen row context en filter context.

Vragen over dit onderwerp?

Plan een kennismaking →