Berekende kolom en measure
Wat is een berekende kolom en een measure?
Een berekende kolom en een measure zijn de twee manieren om je eigen berekeningen toe te voegen aan een Power BI-model, en allebei schrijf je ze in DAX. Ze zien er gelijkaardig uit in de formulebalk, en daarom haalt men ze door elkaar, maar ze draaien op een ander moment en horen op een andere plek.
Een berekende kolom voegt een nieuwe kolom toe aan een tabel. De waarde wordt voor elke rij uitgerekend wanneer de data ververst, en het resultaat wordt opgeslagen in het model, net als elke geimporteerde kolom. Een measure is een berekening die draait op het moment dat een visual erom vraagt, in welke filtercontext die visual ook zet, en het resultaat wordt nergens bewaard.
Kort gezegd: een berekende kolom is een waarde die in een rij zit, een measure is een recept dat draait wanneer het gevraagd wordt.
Berekende kolom: uitgerekend bij de refresh, opgeslagen per rij
Een berekende kolom draait in rijcontext. Ze loopt de tabel rij per rij af en kan elke kolom op de huidige rij uitlezen, dus het is het juiste gereedschap wanneer je echt een waarde op het niveau van een enkele record nodig hebt.
Winst = Sales[Bedrag] - Sales[Kost]Dit wordt een keer per rij uitgerekend tijdens de refresh en dan in het model gehouden. Omdat het opgeslagen is, kan je het gebruiken waar measures niet kunnen komen: op een slicer, in een filter, of als as, legende of groepeerveld in een visual. De prijs is dat elke berekende kolom geheugen inneemt en de refresh verlengt, want de VertiPaq-engine moet de waarden op dezelfde manier opslaan als geimporteerde data. In een model in import-modus is die afweging reeel, en een tabel vol berekende kolommen laat het bestand opzwellen.
Measure: uitgerekend op het moment van de query, in filtercontext
Een measure draait in filtercontext. Ze heeft geen huidige rij, maar reageert op de filters die actief zijn in de visual, de slicers, het filterpaneel en de relaties in het model.
Totale omzet = SUM ( Sales[Bedrag] )Zet dit in een card en het telt alles op. Zet het in een grafiek per maand en het rekent voor elke maand opnieuw. Dezelfde measure geeft in elke cel een ander antwoord omdat de filtercontext eromheen verandert. Er wordt niets opgeslagen: het resultaat wordt berekend wanneer het rapport bekeken wordt en daarna weggegooid, wat het model licht houdt. Een measure kan je alleen als waarde in een visual of als visual-level filter gebruiken, niet als as of slicer.
Wanneer kies je wat?
De regel waar de meeste modelbouwers op uitkomen: kies een measure, en gebruik een berekende kolom alleen wanneer je de waarde op rijniveau opgeslagen nodig hebt. Een paar concrete signalen:
Je wil erop filteren, slicen of groeperen. Een productcategorie-band, een klantsegment-label, een boekjaarweek-bucket: dat zijn waarden die je op een as of slicer wil, dus berekende kolommen.
Je aggregeert of vergelijkt. Totalen, gemiddelden, marges, year-over-year, alles wat op de filters in het rapport moet reageren, hoort in een measure.
De logica hangt af van de huidige rij en zijn relaties. Een waarde opzoeken uit een gerelateerde tabel met
RELATEDom op de rij te bewaren, is werk voor een berekende kolom.
Er is ook een derde optie die het benoemen waard is: kan een waarde stroomopwaarts ontstaan, dan is een aangepaste kolom in Power Query voor de data laadt vaak goedkoper dan een berekende kolom, want ze wordt een keer tijdens het laden berekend in plaats van als gemodelleerde kolom te blijven bestaan. Grijp naar een berekende kolom wanneer de logica relaties of andere tabellen nodig heeft die alleen binnen het model bestaan.
Waar moet je op letten bij het gebruik van berekende kolommen en measures?
Een kolom gebruiken waar een measure hoort. Een totaal in een berekende kolom bewaren bevriest het op rijniveau, waardoor het niet op slicers reageert. Moet het getal veranderen naarmate de lezer filtert, dan moet het een measure zijn.
Wildgroei aan kolommen. Elke berekende kolom wordt opgeslagen en gecomprimeerd als echte data, dus tientallen ervan laten het model groeien en vertragen de refresh. Houd alleen die je nodig hebt om op te filteren of te groeperen.
Aannemen dat ze context op dezelfde manier lezen. Een kolom heeft rijcontext maar geen filtercontext, een measure heeft filtercontext maar geen rijcontext tot een iterator er een geeft. De meeste verwarrende resultaten komen van verwachten dat de ene zich gedraagt als de andere, dus het loont om duidelijk te zijn over filtercontext en rijcontext.