Curabis

DAX beregnet værdi i kolonne, eller Measure?

Dette blogindlæg er mere teknisk natur, idet jeg ind i mellem får spørgsmålet om performance ved større PowerBI rapporter. Det kan godt ske at kompleksiteten i rapporteringsbehøvet udløser 20 og flere tabeller i datamodellen. Beregningerne kan godt belaste serveren. Hvordan? Det afklarer jeg i dette indlæg.

Hvad er en beregnet kolonne?

Med DAX har vi mulighed for at udvide tabeller med informationer, som er relevante for rapporteringen. Lad os tage et eksempel på følgende:

Fra AdventureworksDW databasen henter jeg et simplificeret udtræk af tabellen FactInternetSales. Tabellen indeholder to felter – TotalProductCost samt Salesamount. Vi har nu to muligheder for at beregne dækningsbidraget. Derfor tilføjer jeg et nyt Measure, som jeg kalder GrossMargin.

GrosProfitTotal = SUM(FactInternetSales[Grossmargin])

Den anden metode er at anvende de to Measures, som jo gerne skulle vise de samme tal - men ud fra de aggregerede Measures:

GrosProfitTotal = [SalesAmountTotal] - [ProductCostTotal]

Power BI kolonne

Denne beregning udfører grundlæggende intet andet, end at fratrække produktets samlede kostpris fra produktets samlede salgspris. Denne beregning sker linje for linje i systemet.
En anden interessant aspekt er at disse beregnede felter i datamodellen gemmes i computerens hukommelse.

Hvordan beregnes Measures?

Et measure er intet andet end en beregning, som foretages på en aggregeret grundlag. Measures kan være af forholdsvis kompleks natur, eller – lige som i følgende eksempel forholdsvis enkelt. Jeg vil oprette to forskellige measures, som opsummerer data på

  • SalesAmountTotal = SUM(FactInternetSales[SalesAmount])
  • ProductCostTotal = SUM(FactInternetSales[TotalProductCost])

På baggrund af disse to felter kan vi nu oprette endnu et felt – vores beregnede dækningsbidrag.

GrosProfitTotal = [SalesAmountTotal] - [ProductCostTotal]


Det sjove ved measures er at man ikke kan se dem i vore oversigter. For at gøre dem synlige, skal vi vise dem på en side i vores rapport. Jeg plejer at anvende simple ”Card” visuals for at kontrollere validiteten af min beregning.

 

Power BI Visualize Measures

However, den store forskel til beregnede kolonner er at beregningen af Measures foretages i computerens processor. Ligeledes er resultatet dynamisk og kan dermed begrænses af filtreringer i fx slicere.

Measures kan dermed filtreres, ”slices og dices”, hvilket det følgende eksempel gør synligt:

Power BI Slice and Dice

Ud fra disse betragtninger kan vi faktisk aflede at både measures og beregnede kolonner kan være fornuftige at anvende.

Hvornår skal vi så bruge measures og hvornår beregnede kolonner?

Når nu jeg har afdækket de to forskellige metoder, så kan vi tage en beslutning ud fra følgende betragtning. Skal resultatet bruges række for række, som fx hvis Postnummer og By skal sammenkædes, eller lige som i vores eksempel foretages en beregning på DB pr linje, så er beregnede kolonner det rigtige valg. For at kunne aggregere kolonner, som efterfølgende skal vises med filtreringer, eller sammenligninger med andre datoperioder, vil Measures være absolut at foretrække. Et godt eksempel for et measure er en ”År til dato” beregninger. Disse beregninger er ofte af forholdsvis kompleks natur, idet man ofte kan slice fact-tabellen alle mulige dimensioner som fx kunde, vare, varegruppe, sælger, eller hvad ellers vi kan komme i tanke om.

Measure

Beregnet kolonne

Beregnet ”on demand” – bruger CPU

Gemt i hukommelsen – bruger RAM

Resultat af en opsummering

Resultat af række for række beregning

 

Drop en besked