Relaties verdieping
Je begrijpt actieve vs inactieve relaties en cross-filter richtingen.
Waarom deze les belangrijk is
Je hebt relaties gelegd in Model View. Het leek te werken. Tot je rapport ineens rare totalen laat zien. Of filters die niks doen. Of een visual die gewoon leeg blijft.
Relaties zijn het zenuwstelsel van je datamodel. Als ze niet kloppen, klopt er niets. We gaan dieper in op hoe relaties werken, wanneer je welk type kiest, en hoe je problemen opspoort.
De basis: één-op-veel (1:*) relatie
Dit is de meestgebruikte relatie in Power BI en de basis van het stermodel:
- Dimensietabel (1-kant): Klanten, Producten, Datum
- Feitentabel (*-kant): Verkoopregels, Boekingen, Transacties
De dimensietabel filtert de feitentabel. Niet andersom.

-- Deze measure werkt correct dankzij de relatie Klanten → Verkoopregels:
OmzetPerKlant = SUM( Verkoopregels[NettoOmzet] )
-- Als je filtert op Klanten[Regio] = "Noord", telt SUM alleen de verkoopregels
-- van klanten in regio Noord.Je hebt een dimensietabel Producten (500 rijen) en een feitentabel Verkoopregels (100.000 rijen). Welke tabel staat aan de "1"-kant van de relatie?
Kruisfilterrichting
De pijl op de relatielijn toont de filterrichting. Standaard filtert de "1"-kant de "*"-kant.

| Richting | Betekenis | Wanneer gebruiken |
|---|---|---|
| Enkel (→) | Dimensie filtert feit | Standaard, bijna altijd correct |
| Bidirectioneel (↔) | Beide kanten filteren elkaar | Alleen bij many-to-many of speciale gevallen |
Wanneer enkel (standaard)
In 95% van de gevallen wil je de standaard enkelrichting. Klanten filtert Verkoopregels. Datum filtert Verkoopregels. Producten filtert Verkoopregels.
Verder lezen
Laat je naam en mailadres achter, dan lees je de rest
Je krijgt meteen de hele les, en alle andere lessen blijven daarna ook open. Geen wachtwoord, geen bevestigingsmail.
Wanneer bidirectioneel
Microsoft adviseert: minimaliseer het gebruik van bidirectionele relaties. Ze kunnen queryprestaties negatief beïnvloeden en verwarrende resultaten opleveren. Gebruik bidirectioneel alleen bij:
- Eén-op-één relaties (altijd bidirectioneel, niet anders in te stellen)
- Many-to-many via een brugtabel
- Slicer "met data", wanneer je wilt dat een slicer alleen waarden toont waarvoor data bestaat
Eén-op-één relaties
Twee tabellen met een 1:1 relatie bevatten dezelfde sleutel en elke waarde komt in beide tabellen precies één keer voor.
Wanneer zie je dit?
- Aparte tabellen voor gevoelige data (salarissen apart van medewerkers)
- Gesplitste tabellen om het model kleiner te houden
Best practice: overweeg of je de tabellen niet kunt samenvoegen in Power Query. Dat is vaak eenvoudiger dan een 1:1 relatie.
Veel-op-veel relaties (many-to-many)
Dit is het complexste relatietype. Voorbeeld: één verkoper werkt in meerdere regio's, en één regio heeft meerdere verkopers.
-- Bij een many-to-many relatie kun je NIET zomaar filteren.
-- Power BI waarschuwt: "de relatie kan dubbeltellingen veroorzaken"De oplossing: een brugtabel
| VerkoperID | RegioID |
|---|---|
| V001 | Noord |
| V001 | Oost |
| V002 | Noord |
| V003 | West |
| V003 | Zuid |
Deze tussentabel heeft:
- Een veel-op-één relatie naar Verkopers (VerkoperID)
- Een veel-op-één relatie naar Regio's (RegioID)
- Beide relaties bidirectioneel
Je hebt drie tabellen: Klanten, Verkoopregels en Producten. Verkoopregels heeft relaties met beide. Je wilt een matrix met per klant het aantal unieke producten. Wat heb je nodig?
Actieve vs inactieve relaties
Tussen twee tabellen kan er maar één actieve relatie bestaan. Maar je kunt wel meerdere relaties leggen, de extra relaties worden automatisch inactief (stippellijn in Model View).
Voorbeeld: een Datumtabel die zowel koppelt aan Orderdatum als Factuurdatum in de Verkoopregels.
-- Actieve relatie: Datum → Verkoopregels[Orderdatum]
OmzetPerOrdedatum = SUM( Verkoopregels[NettoOmzet] )
-- Inactieve relatie activeren met USERELATIONSHIP:
OmzetPerFactuurdatum =
CALCULATE(
SUM( Verkoopregels[NettoOmzet] ),
USERELATIONSHIP( Datum[Datum], Verkoopregels[Factuurdatum] )
)Gebruik dit wanneer je dezelfde dimensietabel (bijv. Datum) op meerdere manieren wilt koppelen aan je feitentabel. De actieve relatie is je standaard (bijv. orderdatum). Met USERELATIONSHIP activeer je tijdelijk een inactieve relatie voor een specifieke measure.
Problemen opsporen
| Symptoom | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| Totaal klopt niet | Verkeerde relatie of kardinaliteit | Check Model View, controleer "1" vs "*" kant |
| Filter doet niets | Geen relatie of verkeerde filterrichting | Leg relatie, check pijlrichting |
| Visual is leeg | Ontbrekende relatie | Leg de relatie tussen de tabellen |
| Dubbele waarden | Many-to-many zonder brugtabel | Voeg brugtabel toe |
| Alle rijen dezelfde waarde | Relatie op verkeerde kolom | Check of je sleutels uniek zijn op de "1"-kant |
Je hebt een measure TotaleOmzet = SUM( Verkoopregels[NettoOmzet] ). In een matrix zie je dat het totaal per klant telkens hetzelfde getal is (het overall totaal). Wat is het probleem?
Kijk altijd naar je filterpijlen in Model View. Ze vertellen het hele verhaal: wie filtert wie, en in welke richting. Als een pijl de verkeerde kant op staat, weet je direct waar het probleem zit.
- Één-op-veel (1:*) is de standaardrelatie, dimensie filtert feit
- Filterrichting is standaard enkel (→), bidirectioneel alleen bij many-to-many of 1:1
- Brugtabel is de oplossing voor veel-op-veel tussen dimensietabellen
- USERELATIONSHIP activeert een inactieve relatie in een measure
- Bij problemen: check Model View op ontbrekende relaties, verkeerde kardinaliteit of pijlrichting
Wil je je voortgang bewaren, de oefenbestanden erbij en je inschrijven voor de gratis avond, maak dan een gratis account aan. Je hoeft alleen op een link in je mail te klikken.
Maak een gratis account