Power BI Studio
Terug naar alle artikelen

DAX patterns voor budget versus actuals: de 5 measures die elke FP&A dashboard nodig heeft

Jan Willem den Hollander
Jan Willem den Hollander

Power BI architect, LSS Black Belt. 15 jaar ervaring in data & business intelligence.

DAX patterns voor budget versus actuals: de 5 measures die elke FP&A dashboard nodig heeft

Voorwaarden en benodigdheden

Aan het einde van dit artikel heb je vijf werkende DAX measures waarmee je elke budget versus actuals analyse kunt uitvoeren. Je hebt een Power BI datamodel nodig met minimaal twee tabellen: een factentabel met actuals (bijvoorbeeld Sales) en een dimensietabel Date. Voor budgetgegevens kun je een aparte Budget-tabel gebruiken of budget-records in dezelfde factentabel opslaan met een type-indicator.

Je datamodel moet een relatie hebben tussen je factentabel en Date-tabel op datum-niveau. Zorg dat je Date-tabel alle relevante datums bevat voor zowel historische actuals als toekomstige budgetperiodes.

Stap 1: Basis measures voor actuals en budget

Begin met de fundamentele measures. Deze vormen de basis voor alle andere berekeningen.

Creëer een nieuwe measure voor actuals:

Actuals = 
SUM( Sales[Amount] )

Voor budget hangt de formule af van je datastructuur. Als je budget in dezelfde tabel hebt met een type-indicator:

Budget = 
CALCULATE(
    SUM( Sales[Amount] ),
    Sales[Type] = "Budget"
)

Als je een aparte Budget-tabel hebt:

Budget = 
SUM( Budget[Amount] )

Screenshot: Measures pane toont de twee basis measures Actuals en Budget

Test deze measures door ze in een eenvoudige tabel te plaatsen met Year en Month uit je Date-dimensie. Je zou voor elke maand zowel actuals als budget moeten zien, afhankelijk van je data.

Stap 2: Absolute en percentage variance

Variance is het verschil tussen actuals en budget. Je hebt meestal zowel absolute bedragen als percentages nodig.

Absolute variance measure:

Variance = 
[Actuals] - [Budget]

Percentage variance measure:

Variance % = 
DIVIDE(
    [Actuals] - [Budget],
    [Budget],
    0
)

De DIVIDE functie voorkomt deling door nul fouten. Als er geen budget is, toont de measure 0 in plaats van een foutmelding.

Screenshot: Matrix visual met Month, Actuals, Budget, Variance en Variance % kolommen

Let op de formatting: stel Variance in als currency en Variance % als percentage met één decimaal. Dit maakt je rapport direct leesbaar voor finance medewerkers.

Stap 3: Year-to-date (YTD) vergelijking

FP&A teams willen vaak weten hoe het jaar tot nu toe verloopt. Hiervoor heb je year-to-date measures nodig.

YTD Actuals measure:

YTD Actuals = 
CALCULATE(
    [Actuals],
    DATESYTD( 'Date'[Date] )
)

YTD Budget measure:

YTD Budget = 
CALCULATE(
    [Budget],
    DATESYTD( 'Date'[Date] )
)

YTD Variance measures:

YTD Variance = 
[YTD Actuals] - [YTD Budget]

YTD Variance % = 
DIVIDE(
    [YTD Actuals] - [YTD Budget],
    [YTD Budget],
    0
)

Deze measures tonen automatisch de juiste YTD waarden ongeacht welke maand je selecteert in je rapport. DATESYTD zorgt ervoor dat alle datums vanaf 1 januari tot de geselecteerde datum meegenomen worden.

Screenshot: Card visuals tonen YTD Actuals, YTD Budget en YTD Variance % voor de huidige maand

Stap 4: Rolling forecast berekening

Een rolling forecast combineert actuals voor afgelopen maanden met budget voor toekomstige maanden. Dit geeft het beste inzicht in verwachte jaaromzet.

Deze measure is complexer omdat je verschillende logica nodig hebt per periode:

Rolling Forecast = 
IF(
    MAX( 'Date'[Date] ) <= TODAY(),
    [Actuals],
    [Budget]
)

Voor een meer geavanceerde versie die ook rekening houdt met partiële maanden:

Rolling Forecast Advanced = 
VAR CurrentDate = TODAY()
VAR MaxDate = MAX( 'Date'[Date] )
VAR IsCompleteMonth = 
    DAY( EOMONTH( CurrentDate, 0 ) ) = DAY( CurrentDate )
RETURN
SWITCH(
    TRUE(),
    MaxDate < EOMONTH( CurrentDate, -1 ), [Actuals],
    MaxDate > EOMONTH( CurrentDate, 0 ), [Budget],
    IsCompleteMonth, [Actuals],
    [Budget]
)

Deze advanced versie gebruikt de huidige datum om te bepalen of een maand al compleet is of dat je nog budget-cijfers moet gebruiken voor de rest van de maand.

Stap 5: Cumulative forecast en full year projection

De laatste measure projecteert het hele jaar op basis van je rolling forecast. Dit is cruciaal voor FP&A planning.

Full Year Forecast measure:

Full Year Forecast = 
CALCULATE(
    [Rolling Forecast],
    REMOVEFILTERS( 'Date'[Month] ),
    REMOVEFILTERS( 'Date'[Date] ),
    'Date'[Year] = YEAR( TODAY() )
)

Voor een measure die ook laat zien hoeveel je af zit van het oorspronkelijke jaarbudget:

Full Year vs Budget = 
VAR FullYearBudget = 
    CALCULATE(
        [Budget],
        REMOVEFILTERS( 'Date'[Month] ),
        REMOVEFILTERS( 'Date'[Date] ),
        'Date'[Year] = YEAR( TODAY() )
    )
RETURN
[Full Year Forecast] - FullYearBudget

En de percentage versie:

Full Year vs Budget % = 
VAR FullYearBudget = 
    CALCULATE(
        [Budget],
        REMOVEFILTERS( 'Date'[Month] ),
        REMOVEFILTERS( 'Date'[Date] ),
        'Date'[Year] = YEAR( TODAY() )
    )
RETURN
DIVIDE(
    [Full Year Forecast] - FullYearBudget,
    FullYearBudget,
    0
)

Screenshot: Dashboard overzicht met cards voor Full Year Forecast, Full Year vs Budget en Full Year vs Budget %

Test deze measures door ze in een card visual te plaatsen. Ze zouden een enkele waarde moeten tonen die het hele jaar samenvat, ongeacht welke maand-filter er actief is.

Bonus: Waterfall analysis measure

Voor een waterfall chart heb je een speciale measure nodig die de juiste waarden toont per categorie:

Waterfall Values = 
VAR SelectedCategory = SELECTEDVALUE( 'Waterfall'[Category] )
RETURN
SWITCH(
    SelectedCategory,
    "Budget", [Budget],
    "Actuals", [Actuals],
    "Variance", [Variance],
    BLANK()
)

Deze measure werkt met een aparte Waterfall-tabel die je moet maken met Category kolom: Budget, Actuals, Variance. Let wel op performance — test deze measure met grote datasets voordat je hem in productie zet.

Veelgemaakte fouten

Fout 1: Geen error handling
Gebruik altijd DIVIDE in plaats van gewone deling. Budgetbedragen kunnen nul zijn, vooral bij nieuwe productcategorieën of seizoensgebonden business.

Fout 2: Verkeerde datum-context
DATESYTD werkt alleen correct als je Date-tabel een aaneengesloten datumreeks heeft zonder gaten. Check of elke dag vertegenwoordigd is, ook weekenden.

Fout 3: Budget data uit verschillende bronnen
Als je budget uit Excel haalt en actuals uit je ERP systeem, let dan op verschillende kalenders. Sommige systemen gebruiken 4-4-5 kalenders in plaats van kalenderjaren.

Fout 4: Verkeerde granulariteit
Zorg dat je budget op dezelfde granulariteit staat als je actuals. Als actuals dagelijks zijn maar budget maandelijks, verdeel je budget dan evenredig over de dagen of aggregeer actuals naar maandniveau.

Fout 5: Geen rekening houden met tijdzones
TODAY() gebruikt de Power BI service tijdzone. Voor internationale rapportage wil je mogelijk een vaste datum referentie in plaats van TODAY().

Volgende stap

Test deze measures eerst in een eenvoudig rapport met alleen tabellen en cards. Pas als de cijfers kloppen, bouw je complexere visualisaties. Begin met een Power BI report audit om te checken of je datamodel geoptimaliseerd is voor deze DAX patterns. Een goed datamodel voorkomt performance problemen als je FP&A dashboard groeit naar meer dimensies en langere tijdsperiodes.