De CALCULATE-functie in Power BI uitgelegd
CALCULATE is een DAX-functie die een berekening uitvoert in een aangepaste filtercontext. Je geeft als eerste argument een expressie mee, gevolgd door een of meer filterargumenten die de bestaande context aanpassen of overschrijven. Hiermee kun je berekeningen maken zoals omzet van vorig jaar, omzet voor een specifieke categorie of een percentage van het totaal, ongeacht welke filters de gebruiker in het rapport heeft gezet.
CALCULATE is de meest gebruikte DAX-functie in Power BI. Het past de filtercontext aan van een berekening, zodat je measures kunt schrijven die verder gaan dan simpele sommen.
Wat filtercontext betekent
Elke berekening in Power BI voert uit binnen een filtercontext: het geheel van actieve filters op dat moment. Die filters komen van slicers, rijen in een tabel, kolommen in een matrix en kruisfiltering tussen visuals. Een simpele SUM(Omzet[Bedrag]) telt altijd de rijen op die binnen de huidige filtercontext vallen. CALCULATE laat je die context aanpassen, uitbreiden of deels overschrijven, zonder dat je de structuur van het rapport hoeft te wijzigen. Dat maakt het de spil van vrijwel alle complexe DAX-berekeningen.
De basisstructuur van CALCULATE
De syntaxis is: CALCULATE(expressie, filter1, filter2, ...). Het eerste argument is altijd een expressie, meestal een aggregatie zoals SUM of COUNTROWS. De filterargumenten daarna passen de filtercontext aan. Een directe kolomfilter schrijf je als een booleaanse expressie: Producten[Categorie] = "Elektronica". Je kunt meerdere filters combineren: CALCULATE past ze allemaal toe. Filters die je in CALCULATE opgeeft, vervangen in principe de bestaande filter op dezelfde kolom, tenzij je functies zoals KEEPFILTERS gebruikt.
Concrete voorbeelden
Omzet van vorig jaar schrijf je zo: CALCULATE(SUM(Omzet[Bedrag]), SAMEPERIODLASTYEAR(Datumtabel[Datum])). Dat vereist een datumtabel in je model. Een ander veelgebruikt voorbeeld: een percentage van het totaal. Je deelt de gefilterde omzet door CALCULATE(SUM(Omzet[Bedrag]), ALL(Omzet)), wat de totale omzet geeft ongeacht actieve filters. CALCULATE maakt ook scenario-analyses mogelijk: bereken de omzet alsof een bepaalde categorie niet bestaat door die categorie uit de filtercontext te verwijderen.
Veelgemaakte fout: FILTER onnodig gebruiken
Beginners schrijven vaak CALCULATE(SUM(Omzet[Bedrag]), FILTER(Omzet, Omzet[Categorie] = "A")). Dat werkt, maar is trager dan nodig. FILTER itereert over elke rij van de tabel, terwijl een directe kolomfilter Omzet[Categorie] = "A" efficiënter wordt verwerkt. Gebruik FILTER alleen als je een iteratie echt nodig hebt, bijvoorbeeld als de filterconditie een measure bevat of als je filtert op een berekende expressie per rij. In alle andere gevallen kun je de directe kolomsyntaxis gebruiken.
Wanneer heb je CALCULATE nodig?
Elke berekening die afwijkt van de standaard filtercontext heeft CALCULATE nodig. Denk aan tijdsvergelijkingen (vorig jaar, year-to-date), selectieve sommen (omzet voor één categorie terwijl de gebruiker op een andere filtert), percentage van het totaal, of het negeren van slicerfilters voor een benchmarkwaarde. Zodra je in je Power BI-rapport een measure nodig hebt die “dwars” door de filtercontext heen rekent, is CALCULATE de aangewezen functie.
Onze tip: Schrijf je CALCULATE-measures altijd met duidelijke namen die de logica weerspiegelen, zoals
Omzet VJofOmzet % van Totaal. Voeg een commentaarregel toe boven de measure met een korte uitleg van wat de filter doet. Dat bespaart je collega’s (en jezelf drie maanden later) veel uitzoekwerk.
Veelgestelde vragen
Wat is het verschil tussen CALCULATE en FILTER in DAX?
FILTER geeft een gefilterde tabel terug als resultaat. CALCULATE voert een berekening uit in een aangepaste filtercontext. Je kunt FILTER gebruiken als argument in CALCULATE om een complexe tabelfilter door te geven, maar voor eenvoudige kolom-gelijkstellingen is dat onnodig. Schrijf liever CALCULATE(SUM(Omzet[Bedrag]), Omzet[Categorie] = "A") dan CALCULATE(SUM(Omzet[Bedrag]), FILTER(Omzet, Omzet[Categorie] = "A")). De eerste versie is sneller omdat hij geen iteratie over de volledige tabel vereist.
Hoe werkt CALCULATE met een datumtabel?
CALCULATE werkt goed samen met tijdintelligentiefuncties zoals SAMEPERIODLASTYEAR, DATEADD en TOTALYTD. Die functies retourneren een gefilterde datumtabel die je als filter aan CALCULATE meegeeft. Voorwaarde is dat je datamodel een aparte datumtabel heeft die als datumtabel is gemarkeerd. Zonder die datumtabel werken de meeste tijdintelligentiefuncties niet. Lees hoe je een datumtabel toevoegt in het artikel over de Power BI-datumtabel.
Kan CALCULATE filters ook verwijderen in plaats van toevoegen?
Ja. Met de functie ALL() als filterargument verwijder je bestaande filters van een tabel of kolom. CALCULATE(SUM(Omzet[Bedrag]), ALL(Omzet)) berekent de totale omzet ongeacht welke filters actief zijn in het rapport. Dat is handig voor percentageberekeningen: je deelt de gefilterde omzet door de totale omzet via ALL(). ALLEXCEPT() verwijdert alle filters op een tabel behalve de kolommen die je opgeeft.