Snelle berekeningen in Power Pivot met DAX
Uitvoer Berekeningen Voorbereiden Invoer
Twee soorten DAX-berekeningen Berekende kolom Voegt een kolom toe aan een tabel Wordt berekend (gevalideerd) bij het maken of verversen van data Resultaten worden opgeslagen in het model, en nemen dus ruimte in Altijd gebonden aan een tabel Voorbeeld: =[Prijs]*[Aantal] Berekend veld Definieert een aggregatie-functie Wordt berekend (gevalideerd) bij gebruik Resultaten worden alleen opgeslagen in draaitabellen of grafieken Niet gebonden aan een tabel (maar wel geplaatst bij een tabel) Voorbeeld: Omzet:=SUM(Verkoop[Bedrag])
Context
Selectiecontext (ook wel: querycontext)
Rijcontext Datum Product Prijs Aantal Bedrag 13-10-2013 Pen 1,25 50 62,50 25-11-2013 Potlood 0,95 150 142,50 5-12-2013 Potlood 0,90 200 180,00 8-12-2013 Schrijfblok 2,45 80 196,00 12-12-2013 Pen 1,30 50 65,00 In een rij kent Power Pivot de waarde van elke kolom, maar geen waarden in andere rijen
DAX Syntax Berekende kolom: Begint met = Verwijst naar kolommen in de tabel met [Kolomnaam] Berekend veld: Begint met NaamVeld:= Verwijst naar kolommen in een tabel met Tabelnaam[Kolomnaam] (best practice) Operatoren: + - * / & Functies: FUNCTIE(argument1;argument2;...) Functies kunnen genest worden Houd je formules kort! DAX-functies zijn Engelstalig: niet SOM maar SUM
Basisfuncties Aggregatiefuncties SUM, AVERAGE, MIN, MAX, COUNT Logische functies IF, AND, OR, NOT Bijvoorbeeld: gemiddelde prijs GemiddeldePrijs:= SUM(Verkoop[Bedrag]) / SUM(Verkoop[Aantal]) of in Excel 2013: GemiddeldePrijs:= DIVIDE(SUM(Verkoop[Bedrag]);SUM(Verkoop[Aantal];0)
Filters Filters passen de selectiecontext aan: filtercontext DAX
Filters toepassen met CALCULATE Syntax: Resultaat:=CALCULATE([Expressie];<Filter1>;<Filter2>; ) Bijvoorbeeld Omzet303:=CALCULATE([Omzet];Product[Nr]=303) Korte schrijfwijze (en vaak efficienter): Omzet304:=[Omzet](Product[Nr]=304) CALCULATE laat niet elk filter toe, voor complexere filters gebruik je de tabelfunctie FILTER.
ALL ALL is een filterfunctie, bijvoorbeeld TotaalOmzet:=CALCULATE([Omzet];ALL(Product)) Deze berekening geeft [Omzet] voor alle producten in de tabel Product ALL(Tabel): heft alle (selectie)filters op Tabel op ALL(Tabel[Kolom]): heft alle filters op Tabel[Kolom] op, maar niet op andere kolommen in dezelfde tabel ALLEXCEPT(Tabel[Kolom]): heft alle filters op Tabel op, behalve die op Tabel[Kolom]
Intelligente tijdfuncties Engels: time intelligence Werkt op datums, niet op tijdstippen... Datumtabel (bijvoorbeeld Datum) Een rij per dag (bijv. Datum[Datum]) Filteren op kolommen in de datumtabel Markeer tabel als datumtabel in je model Elke intelligente tijdfunctie verwijst naar Datum[Datum]
Mijn favoriete DAX-functie: TOTALYTD Year to date berekeningen maak je met TOTALYTD Syntax: TOTALYTD(<expressie>;Datum[Datum]) Bijvoorbeeld OmzetYTD:=TOTALYTD([Omzet];Datum[Datum] TOTALYTD gebruik je niet alleen om totalen (SUM) uit te rekenen! Bijvoorbeeld TOTALYTD([HoogstePrijs];Datum[Datum]) Berekent de hoogste prijs vanaf het begin van het jaar tot nu toe In feite is TOTALYTD, en elke intelligente tijdfunctie een filterfunctie die filtert op de datumtabel
Voorbeelden van intelligente tijdfuncties TOTALYTD, TOTALQTD, TOTALMTD SAMEPERIODLASTYEAR STARTOFYEAR, ENDOFYEAR FIRSTDATE, LASTDATE DATEADD, PARALLELPERIOD DATESINPERIOD, DATESBETWEEN
Tabelfuncties Functies die een tabel gebruiken als argument SUMX, AVERAGEX, MINX, MAXX, COUNTX COUNTROWS Bijvoorbeeld: AvgKlant:=AVERAGEX(Klanten;[Omzet]) Hier is Klanten een tabel met klanten, en [Omzet] een berekend veld.
Tabelfuncties (2) Functies die een tabel maken: berekende tabel Een berekend veld mag nooit een tabel opleveren als resultaat! Een berekende tabel gebruik je als argument in een andere tabelfunctie Voorbeelden: ALL, ALLEXCEPT TOPN VALUES, DISTINCT AvgKlant:=AVERAGEX(DISTINCT(Verkopen[KlantNr]);[Omzet])
FILTER De functie FILTER is een tabelfunctie: met een tabel als argument die een berekende tabel als resultaat heeft De DAX functie hieronder geeft het aantal klanten met een hogere omzet dan de gemiddelde omzet van de top 25: AantalTopKlanten:=COUNTROWS( FILTER(Klanten;[Omzet]> AVERAGEX(TOPN(25;Klanten;[Omzet]);[Omzet]) ))