Calculation groups in Power BI: één measure voor 20 KPI-varianten
Power BI architect, LSS Black Belt. 15 jaar ervaring in data & business intelligence.

Aan het einde van dit artikel heb je een functionerende calculation group die 20 verschillende KPI-varianten genereert vanuit één basismeasure. Je hebt Power BI Desktop, Tabular Editor (gratis versie is voldoende), en een dataset met verkoopcijfers nodig.
Wat zijn calculation groups eigenlijk
Calculation groups zijn Power BI-objecten die je kunt toepassen op bestaande measures om nieuwe berekeningen te maken. In plaats van 20 afzonderlijke measures te schrijven voor omzetgroei, budget variance, rolling average en andere varianten, schrijf je één basismeasure en laat de calculation group al die varianten genereren.
Het principe werkt als een filter die je over een measure legt. Je hebt bijvoorbeeld een measure Omzet die €100.000 weergeeft. Met een calculation group item "YoY Growth" transformeer je die €100.000 automatisch naar de year-over-year groeipercentage zonder een nieuwe measure te schrijven.
Het verschil met gewone measures is dat calculation groups werken op het niveau van de query-engine. Ze worden toegepast nadat de basismeasure is berekend, wat ze krachtig maar ook complex maakt voor beginners.
Voorwaarden en benodigde tools
Voor deze tutorial heb je het volgende nodig:
- Power BI Desktop (meest recente versie)
- Tabular Editor 2 (gratis download via tabulareditor.github.io)
- Een dataset met datums en numerieke waarden
- Basiskennis van DAX functies zoals CALCULATE en SAMEPERIODLASTYEAR
Calculation groups kunnen niet worden gemaakt in Power BI Desktop zelf. Je hebt externe tools zoals Tabular Editor nodig omdat Microsoft deze functionaliteit nog niet heeft toegevoegd aan de standaard interface.
Let op: calculation groups werken alleen in Power BI Pro of Premium workspaces. In Power BI Desktop kun je ze wel gebruiken, maar publiceren naar een gratis workspace zal mislukken.
Stap 1: Basismeasure opzetten in Power BI Desktop
Open Power BI Desktop en laad je dataset. Voor dit voorbeeld gebruiken we een simpele verkoopdataset met kolommen Date, Sales Amount en Product.
Maak eerst de basismeasure waarop alle varianten gebaseerd worden:
Total Sales = SUM(Sales[Sales Amount])Test deze measure in een tabel of kaartvisualisatie. Je moet een totaal zien dat overeenkomt met je verwachtingen. Als deze measure niet correct werkt, zullen alle calculation group items ook foutieve resultaten geven.
Sla je Power BI-bestand op voordat je doorgaat naar Tabular Editor. Dit voorkomt dataverlies als er iets misgaat tijdens het bewerken van het datamodel.
Stap 2: Tabular Editor installeren en verbinden
Download Tabular Editor 2 van de officiële website en installeer deze. Start Tabular Editor en verbind met je Power BI Desktop-bestand via "File > Open > From DB".
In het verbindingsvenster vul je het volgende in:
- Server: localhost:portnumber (het poortnummer vind je in Power BI Desktop onder "File > Options and settings > Options > Diagnostics")
- Database: het wordt automatisch gedetecteerd
Als de verbinding succesvol is, zie je de mappenstructuur van je datamodel in het linkervenster van Tabular Editor. Je ziet Tables, Relationships en Measures. Dit bevestigt dat je correct verbonden bent.
Screenshot: Tabular Editor interface met het Power BI datamodel geladen in het linkervensterStap 3: Calculation group aanmaken
In Tabular Editor, rechtsklik in het lege gebied onder de tabellen en kies "Create New > Calculation Group". Noem deze "Time Intelligence KPIs".
Je nieuwe calculation group verschijnt als een speciale tabel met een oranje icoon. Binnen deze groep ga je verschillende calculation items maken die elk een andere berekening vertegenwoordigen.
De calculation group heeft automatisch twee kolommen gekregen: "Name" en "Ordinal". De Name-kolom bevat de labels die gebruikers zien, Ordinal bepaalt de volgorde waarin items verschijnen in filters.
Stap 4: Eerste calculation items maken
Rechtsklik op je calculation group "Time Intelligence KPIs" en kies "Create New > Calculation Item". Dit wordt je eerste variant.
Noem het eerste item "Current Period" en voer deze DAX-formule in:
SELECTEDMEASURE()Dit item toont gewoon de originele waarde van elke measure waarop het wordt toegepast. Het dient als standaard baseline.
Maak een tweede item "Previous Year" met deze formule:
CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Date'[Date]))Vervang 'Date'[Date] door de datumlkolom in jouw model. Dit item toont de waarde van dezelfde periode vorig jaar.
Screenshot: Calculation items in Tabular Editor met de DAX-formules zichtbaarStap 5: Year-over-Year varianten toevoegen
Voeg een derde calculation item toe genaamd "YoY Growth %":
VAR CurrentValue = SELECTEDMEASURE()
VAR PreviousYear = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Date'[Date]))
RETURN
IF(
NOT ISBLANK(PreviousYear) && PreviousYear <> 0,
DIVIDE(CurrentValue - PreviousYear, PreviousYear)
)Deze formule berekent de procentuele groei ten opzichte van vorig jaar. De IF-statement voorkomt delen door nul of lege waarden.
Voeg "YoY Growth Amount" toe voor absolute verschillen:
VAR CurrentValue = SELECTEDMEASURE()
VAR PreviousYear = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Date'[Date]))
RETURN
CurrentValue - PreviousYearTest deze items door wijzigingen op te slaan in Tabular Editor (Ctrl+S) en terug te gaan naar Power BI Desktop. Ververs het datamodel (rechtsklik op dataset > Refresh).
Stap 6: Rolling averages en cumulatieve varianten
Voor een 3-maanden rollend gemiddelde, maak een item "3M Rolling Avg":
VAR CurrentDate = MAX('Date'[Date])
VAR ThreeMonthsBack = DATEADD(CurrentDate, -2, MONTH)
RETURN
COUNTROWS(
DATESBETWEEN(
'Date'[Date],
ThreeMonthsBack,
CurrentDate
)
) >= 3 && AVERAGEX(
DATESBETWEEN(
'Date'[Date],
ThreeMonthsBack,
CurrentDate
),
CALCULATE(SELECTEDMEASURE())
)Voor jaar-tot-datum cumulatief, voeg "YTD" toe:
TOTALYTD(SELECTEDMEASURE(), 'Date'[Date])En voor een cumulatief totaal vanaf begin van de dataset, maak "Running Total":
CALCULATE(
SELECTEDMEASURE(),
FILTER(
ALL('Date'),
'Date'[Date] <= MAX('Date'[Date])
)
)Stap 7: Ranking en vergelijkingsvarianten
Voor ranking binnen de huidige maand, voeg "Rank in Month" toe:
VAR CurrentMonth = EOMONTH(MAX('Date'[Date]), 0)
VAR StartOfMonth = EOMONTH(CurrentMonth, -1) + 1
RETURN
RANKX(
FILTER(
ALL('Date'),
'Date'[Date] >= StartOfMonth &&
'Date'[Date] <= CurrentMonth
),
CALCULATE(SELECTEDMEASURE()),
,
DESC
)Voor percentiel vergelijking binnen het jaar:
VAR YearStart = DATE(YEAR(MAX('Date'[Date])), 1, 1)
VAR YearEnd = DATE(YEAR(MAX('Date'[Date])), 12, 31)
RETURN
PERCENTILEX.INC(
FILTER(
ALL('Date'),
'Date'[Date] >= YearStart &&
'Date'[Date] <= YearEnd
),
CALCULATE(SELECTEDMEASURE()),
0.5
)Deze berekeningen geven inzicht in hoe de huidige waarde zich verhoudt tot andere periodes binnen hetzelfde jaar.
Stap 8: Formattering en ordening instellen
Stel de Ordinal-waarden in om de volgorde te bepalen waarin items verschijnen in slicers. Gebruik stappen van 10 (10, 20, 30, etc.) zodat je later makkelijk items kunt toevoegen.
Voor percentage-items zoals "YoY Growth %", stel het Format String in op "0.0%" via de Properties van het calculation item. Voor currency-items gebruik je "€#,##0" of je lokale valuta-format.
In het Properties-venster van elk calculation item kun je ook een beschrijving toevoegen die verschijnt als tooltip in Power BI rapporten. Dit helpt eindgebruikers begrijpen wat elk item doet.
Screenshot: Properties venster met Format String en Description instellingenStap 9: Testen in Power BI Desktop
Sla alle wijzigingen op in Tabular Editor en ga terug naar Power BI Desktop. Ververs het datamodel door rechts te klikken op je dataset en "Refresh" te kiezen.
In het Fields-venster zie je nu je calculation group "Time Intelligence KPIs" staan. Sleep deze naar een slicer om de verschillende varianten te kunnen selecteren.
Maak een tabel met je basismeasure "Total Sales" en enkele datumvelden. Selecteer verschillende items uit de slicer om te zien hoe de waardes veranderen. "YoY Growth %" moet percentages tonen, "YTD" moet cumulatieve bedragen geven.
Test elke calculation item met verschillende datumperiodes om te controleren of de berekeningen kloppen. Vergelijk handmatig enkele waarden om er zeker van te zijn dat formules correct werken.
Stap 10: Geavanceerde varianten toevoegen
Voor meer geavanceerde analyses, voeg deze items toe:
"Moving Annual Total" voor een rollend 12-maanden totaal:
VAR CurrentDate = MAX('Date'[Date])
VAR OneYearBack = DATEADD(CurrentDate, -11, MONTH)
RETURN
CALCULATE(
SELECTEDMEASURE(),
DATESBETWEEN(
'Date'[Date],
OneYearBack,
CurrentDate
)
)"Budget Variance" (als je een budget-kolom hebt):
VAR ActualValue = SELECTEDMEASURE()
VAR BudgetValue = SUM(Budget[Budget Amount])
RETURN
ActualValue - BudgetValue"Forecast" voor eenvoudige lineaire projectie:
VAR HistoricalAverage = AVERAGEX(
DATESBETWEEN(
'Date'[Date],
DATE(YEAR(TODAY()), 1, 1),
TODAY()
),
CALCULATE(SELECTEDMEASURE())
)
RETURN
HistoricalAverage * 1.1 -- 10% groei assumptieDeze geavanceerde items laten zien hoe krachtig calculation groups kunnen zijn voor complexe analytische behoeften.
Veelgemaakte fouten
De meest voorkomende fout is het vergeten van SELECTEDMEASURE() in calculation items. Dit resulteert in lege of foutieve waardes omdat de calculation group niet weet welke measure hij moet transformeren.
Een tweede veel voorkomende fout is het gebruik van verkeerde datumreferenties. Zorg ervoor dat 'Date'[Date] verwijst naar je werkelijke datumtabel en datumkolom. Als je model een andere structuur heeft, pas de referenties aan.
Let ook op de volgorde van calculation items. Als je Ordinal-waarden doorelkaar staan, verschijnen items in een vreemde volgorde in slicers, wat verwarring veroorzaakt bij eindgebruikers.
Format String-fouten zijn subtiel maar irritant. Een percentage-calculation item zonder percentage-formattering toont 0.15 in plaats van 15%. Controleer altijd de Format String property van elk item.
Een laatste veelgemaakte fout is het testen van calculation groups met lege of incomplete datasets. Veel formules breken als er geen data is voor bepaalde periodes. Test altijd met realistische datasets die edge cases dekken.
Volgende stap
Experimenteer nu met je eigen measures en voeg meer calculation items toe specifiek voor jouw use cases. Voor complexere DAX-uitdagingen kun je de DAX Formula Assistant gebruiken om formules in gewone taal om te zetten naar correcte DAX-syntax.