Delen via


Berekeningsgroepen

Van toepassing op: SQL Server 2019 en hoger Analysis Services Azure Analysis Services Fabric/Power BI Premium

Berekeningsgroepen kunnen het aantal redundante metingen aanzienlijk verminderen door algemene meetexpressies te groeperen als berekeningsitems. Berekeningsgroepen worden ondersteund in tabellaire modellen op het compatibiliteitsniveau 1500 en hoger.

Voordelen

Berekeningsgroepen hebben betrekking op een probleem in complexe modellen waarbij er sprake kan zijn van een toename van redundante maatregelen met behulp van dezelfde berekeningen, meestal met time intelligence-berekeningen. Een verkoopanalist wil bijvoorbeeld verkooptotalen en orders per maand tot heden (MTD), kwartaal tot heden (QTD), jaar tot heden (YTD), orders per jaar tot heden weergeven voor het vorige jaar (PY), enzovoort. De gegevensmodeller moet afzonderlijke metingen maken voor elke berekening, wat kan leiden tot tientallen metingen. Voor de gebruiker kan dit betekenen dat u net zoveel metingen moet sorteren en ze afzonderlijk op hun rapport moet toepassen.

Laten we eerst eens kijken hoe berekeningsgroepen voor gebruikers worden weergegeven in een rapportageprogramma zoals Power BI. Vervolgens bekijken we wat een berekeningsgroep is en hoe ze in een model worden gemaakt.

Berekeningsgroepen worden weergegeven in rapportageclients als een tabel met één kolom. De kolom is niet vergelijkbaar met een typische kolom of dimensie, maar vertegenwoordigt een of meer herbruikbare berekeningen of berekeningsitems die kunnen worden toegepast op een meting die al is toegevoegd aan het filter Waarden voor een visualisatie.

In de volgende animatie analyseert een gebruiker verkoopgegevens voor jaren 2012 en 2013. Voordat u een berekeningsgroep toepast, berekent de algemene basismeting Verkoop een som van de totale verkoop voor elke maand. De gebruiker wil vervolgens time intelligence-berekeningen toepassen om verkooptotalen op te halen voor maandtotalen, kwartaal tot heden, jaar tot heden, enzovoort. Zonder berekeningsgroepen moet de gebruiker afzonderlijke time intelligence-metingen selecteren.

Met een berekeningsgroep, in dit voorbeeld Time Intelligence, wanneer de gebruiker het item Tijdberekening naar het filtergebied Kolommen sleept, wordt elk berekeningsitem weergegeven als een afzonderlijke kolom. Waarden voor elke rij worden berekend op basis van de basismeting Sales.

Berekeningsgroep die wordt toegepast in Power BI

Berekeningsgroepen werken met expliciete DAX-metingen. In dit voorbeeld is Sales een expliciete meting die al in het model is gemaakt. Berekeningsgroepen werken niet met impliciete DAX-metingen. In Power BI worden impliciete maatstaven bijvoorbeeld gemaakt wanneer een gebruiker kolommen naar visuals sleept om geaggregeerde waarden weer te geven, zonder dat er een expliciete maatstaf wordt gecreëerd. Op dit moment genereert Power BI DAX voor impliciete metingen die zijn geschreven als inline DAX-berekeningen. Impliciete metingen kunnen dus niet werken met berekeningsgroepen. Er is een nieuwe modeleigenschap in het Tabular Object Model (TOM) geïntroduceerd, DiscourageImplicitMeasures. Als u momenteel berekeningsgroepen wilt maken, moet deze eigenschap worden ingesteld op true. Indien ingesteld op true, schakelt Power BI Desktop in Live Connect-modus het maken van impliciete metingen uit.

Berekeningsgroepen ondersteunen ook MDX-query's (Multidimensional Data Expressions). Dit betekent dat Microsoft Excel-gebruikers, die query's uitvoeren op gegevensmodellen in tabelvorm met behulp van MDX, volledig kunnen profiteren van berekeningsgroepen in werkblad draaitabellen en grafieken.

Hoe ze werken

Nu u hebt gezien hoe berekeningsgroepen profiteren van gebruikers, gaan we kijken hoe het weergegeven voorbeeld van de Time Intelligence-berekeningsgroep wordt gemaakt.

Voordat we verdergaan met de details, introduceren we enkele nieuwe DAX-functies specifiek voor berekeningsgroepen:

SELECTEDMEASURE - Wordt gebruikt door expressies voor berekeningselementen om te verwijzen naar de maatstaf die momenteel in context is. In dit voorbeeld wordt de maatstaf Verkoop geëvalueerd.

SELECTEDMEASURENAME - Wordt gebruikt door expressies voor berekeningsitems om de meting te bepalen die op naam binnen de context staat.

ISSELECTEDMEASURE - Wordt gebruikt door expressies voor berekeningsitems om de meting te bepalen die in context is opgegeven in een lijst met metingen.

SELECTEDMEASUREFORMATSTRING - Wordt gebruikt door expressies voor berekeningsitems om de notatietekenreeks op te halen van de meting die zich in de context bevindt.

Time Intelligence-voorbeeld

Tabelnaam - Time Intelligence
Kolomnaam - Tijdberekening
Prioriteit - 20

Time Intelligence-berekeningen

Huidig

SELECTEDMEASURE()

MTD

CALCULATE(SELECTEDMEASURE(), DATESMTD(DimDate[Date]))

QTD

CALCULATE(SELECTEDMEASURE(), DATESQTD(DimDate[Date]))

YTD

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

PY

CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(DimDate[Date]))

PY MTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "MTD"
)

PY QTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "QTD"
)

PY YTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

YOY

SELECTEDMEASURE() -
CALCULATE(
    SELECTEDMEASURE(),
    'Time Intelligence'[Time Calculation] = "PY"
)

YOY-%

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

Als u deze berekeningsgroep wilt testen, voert u een DAX-query uit in SSMS of de opensource-DAX Studio. Opmerking: YOY- en YOY-% worden weggelaten uit dit queryvoorbeeld.

Time Intelligence-query

EVALUATE
CALCULATETABLE (
    SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Current", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "Current" ),
        "QTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "QTD" ),
        "YTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "YTD" ),
        "PY",      CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY" ),
        "PY QTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY QTD" ),
        "PY YTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY YTD" )
    ),
    DimDate[CalendarYear] IN { 2012, 2013 }
)

Time Intelligence-queryresultaat

In de retourtabel ziet u berekeningen voor elk toegepast berekeningselement. Zie bijvoorbeeld QTD voor maart 2012 is de som van januari, februari en maart 2012.

Time intelligence-query retourneren

Tekenreeksen met dynamische opmaak

Met dynamische notatietekenreeksen met berekeningsgroepen kunnen tekenreeksen voorwaardelijk worden toegepast op metingen zonder dat ze tekenreeksen hoeven te retourneren.

Tabellaire modellen ondersteunen dynamische opmaak van metingen met behulp van de functie FORMAT van DAX. De functie FORMAT heeft echter het nadeel dat deze een tekenreeks retourneert, waardoor waarden die anders numeriek zouden zijn, ook als een tekenreeks worden geretourneerd. Dit kan enkele beperkingen hebben, zoals het niet werken met de meeste Power BI-visuals, afhankelijk van numerieke waarden, zoals grafieken.

In Power BI kunnen dynamische opmaaktekenreeksen voor meetwaarden ook voorwaardelijk worden toegepast op een specifieke meetwaarde, zonder dat ze een tekenreeks hoeven te retourneren en zonder gebruik te maken van calculatiegroepen. Zie Tekenreeksen voor dynamische notatie voor metingen voor meer informatie.

Dynamische opmaakreeksen voor tijdintelligentie

Als we het bovenstaande Time Intelligence-voorbeeld bekijken, moeten alle berekeningsitems behalve YOY-% de indeling van de huidige meting in context gebruiken. YTD die is berekend op de basismeting Verkoop moet bijvoorbeeld valuta zijn. Als dit een berekeningsgroep was voor iets als een basismeting Orders, is de notatie numeriek. YOY-%moet echter een percentage zijn, ongeacht de indeling van de basismeting.

Voor YOY-%kunnen we de notatietekenreeks overschrijven door de eigenschap tekenreeksexpressie in te stellen op 0,00%;-0.00%;0,00%. Zie voor meer informatie over de eigenschappen van de opmaak van tekenreeksexpressies MDX Cell Properties - FORMAT STRING Contents.

In deze matrixvisual in Power BI ziet u dat sales Current/YOY en Orders Current/YOY de bijbehorende tekenreeksen voor basismetingen behouden. Verkoop YOY-% en Orders YOY-%overschrijft echter de notatietekenreeks om de percentagenotatie te gebruiken.

Time intelligence in matrixvisual

Dynamische formattering voor valutaconversie

Dynamische formateringsreeksen bieden eenvoudige valutaconversie. Houd rekening met het volgende Adventure Works-gegevensmodel. Het is gemodelleerd voor een-op-veel valutaconversie, zoals gedefinieerd door conversietypen.

Valutakoers in tabellair model

Er wordt een FormatString-kolom toegevoegd aan de tabel DimCurrency en gevuld met notatietekenreeksen voor de respectieve valuta's.

Tekenreekskolom opmaken

Voor dit voorbeeld wordt de volgende berekeningsgroep gedefinieerd als:

Voorbeeld van valutaconversie

Tabelnaam - Valutaconversie
Kolomnaam - Conversieberekening
Prioriteit - 5

Berekeningsitems voor valutaconversie

Geen conversie

SELECTEDMEASURE()

Geconverteerde valuta

IF(
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE( DimCurrency[CurrencyName], "US Dollar" ) = "US Dollar",
    SELECTEDMEASURE(),
    SUMX(
        VALUES(DimDate[Date]),
        CALCULATE( DIVIDE( SELECTEDMEASURE(), MAX(FactCurrencyRate[EndOfDayRate]) ) )
    )
)

Tekenreeksexpressie opmaken

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

Opmerking

Selectie-expressies voor berekeningsgroepen zijn momenteel in preview en kunnen worden gebruikt voor het implementeren van automatische valutaconversie voor berekeningsgroepen, zodat er geen twee afzonderlijke berekeningsitems hoeven te zijn.

De notatietekenreeksexpressie moet een scalaire tekenreeks retourneren. De nieuwe functie SELECTEDMEASUREFORMATSTRING wordt gebruikt om terug te keren naar de tekenreeks voor de basismetingnotatie als er meerdere valuta's in de filtercontext zijn.

In de volgende animatie ziet u de conversie van valuta in dynamische opmaak voor de verkoopmaatstaf in een rapport.

Dynamische notatietekenreeks voor valutaconversie toegepast

Selectie-expressies (voorbeeld)

Selectie-expressies zijn optionele eigenschappen die zijn gedefinieerd voor een berekeningsgroep. Er zijn twee typen selectie-expressies:

  • multipleOrEmptySelectionExpression. Deze selectie-expressie wordt toegepast wanneer er meerdere berekeningsitems zijn geselecteerd, een niet-bestaand berekeningsitem is geselecteerd of wanneer er een conflicterende selectie is gemaakt.
  • noSelectionExpression. Deze selectie-expressie wordt toegepast wanneer de berekeningsgroep niet wordt gefilterd.

Beide selectie-expressies hebben ook een formaattekenreeksdefinitie dynamische opmaaktekenreeks expressie.

Kortom, in een berekeningsgroep kan het volgende worden gedefinieerd:

...
"calculationGroup": {
  "multipleOrEmptySelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  },
  "noSelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  }
...
}

Opmerking

Deze expressies, indien opgegeven, worden alleen toegepast op de specifieke situaties die worden vermeld. Selecties voor één berekeningsitem worden niet beïnvloed door deze expressies.

Hier volgt een overzicht van deze expressies en hun standaardgedrag als deze niet zijn opgegeven:

Type van selectie Selectie-expressie niet gedefinieerd (standaard) Gedefinieerde selectie-expressie
Eén selectie Selectie wordt toegepast Selectie wordt toegepast
Meerdere selecties De berekeningsgroep is niet gefilterd Geef het resultaat van het evalueren van multipleOrEmptySelectionExpression terug
Lege selectie De berekeningsgroep is niet gefilterd Resultaat van het evalueren van multipleOrEmptySelectionExpression
Geen selectie De berekeningsgroep is niet gefilterd Resultaat van het evalueren van noSelectionExpression

Meervoudige of lege selectie

Als er meerdere selecties in dezelfde berekeningsgroep worden gemaakt, evalueert en retourneert de berekeningsgroep het resultaat van de multipleOrEmptySelectionExpression indien gedefinieerd. Als deze expressie niet is gedefinieerd, retourneert de berekeningsgroep het volgende resultaat:

SELECTEDMEASURE()

Laten we eens kijken naar een berekeningsgroep met de naam MyCalcGroup met een multipleOrEmptySelectionExpression die als volgt is geconfigureerd:

IF (
ISFILTERED ( 'MyCalcGroup' ),
    "Filters: " 
         & CONCATENATEX ( 
  	            FILTERS ( 'MyCalcGroup'[Name] ),
            'MyCalcGroup'[Name], 
            ", "
     	   )
)

Stel nu de volgende selectie in voor de berekeningsgroep:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item1" || 'MyCalcGroup'[Name] = "item2"
    )
}

Hier selecteren we twee items in de berekeningsgroep, 'item1' en 'item2'. Dit is een meervoudige selectie en daarom wordt de multipleOrEmptySelectionExpression geëvalueerd en wordt het volgende resultaat geretourneerd: "Filters: item1, item2".

Voer vervolgens de volgende selectie uit voor de berekeningsgroep:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item4" -- item4 does not exists
    )
}

Dit is een voorbeeld van een lege selectie, omdat 'item4' niet bestaat in deze berekeningsgroep. Daarom wordt de multipleOrEmptySelectionExpression geëvalueerd en wordt het volgende resultaat geretourneerd: "Filters: ".

Geen selectie

De noSelectionExpression op een berekeningsgroep wordt toegepast als de berekeningsgroep niet is gefilterd. Dit wordt meestal gebruikt om standaardacties uit te voeren zonder dat de gebruiker actie hoeft te ondernemen, terwijl de gebruiker nog steeds flexibel is om de standaardactie te overschrijven. Laten we bijvoorbeeld kijken naar automatische valutaconversie met Amerikaanse dollar als de centrale draaitabelvaluta.

We kunnen een berekeningsgroep instellen met de volgende noSelectionExpression:

IF (
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE (
        DimCurrency[CurrencyName],
        "US Dollar"
    ) = "US Dollar",
    SELECTEDMEASURE (),
    SUMX (
        VALUES ( DimDate[DateKey] ),
        CALCULATE (
            DIVIDE ( SELECTEDMEASURE (), MAX ( FactCurrencyRate[EndOfDayRate] ) )
        )
    )
)

We stellen ook een formatStringDefinition in voor deze expressie:

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

Als er nu geen valuta is geselecteerd, worden alle valuta's indien nodig automatisch geconverteerd naar de draaitabelvaluta (Amerikaanse dollar). Bovendien kunt u nog steeds een andere valuta kiezen om naar die valuta te converteren zonder dat u van berekeningsitems hoeft te wisselen, zoals u zou moeten doen zonder de noSelectionExpression.

Voorrang

Prioriteit is een eigenschap die is gedefinieerd voor een berekeningsgroep. Hiermee geeft u de volgorde op waarin de berekeningsgroepen worden gecombineerd met de onderliggende meting bij het gebruik van SELECTEDMEASURE() in het berekeningsitem.

Voorbeeld van prioriteit

Laten we een eenvoudig voorbeeld bekijken. Dit model heeft een meting met een opgegeven waarde van 10 en twee berekeningsgroepen, elk met één berekeningsitem. We gaan de berekeningsitems van beide berekeningsgroepen toepassen op de meting. Dit is hoe we het instellen:

'Measure group'[Measure] = 10

De eerste berekeningsgroep is 'Calc Group 1 (Precedence 100)' en het berekeningsitem is 'Calc item (Plus 2)':

'Calc Group 1 (Precedence 100)'[Calc item (Plus 2)] = SELECTEDMEASURE() + 2

De tweede berekeningsgroep is 'Calc Group 2 (Precedence 200)' en het berekeningsitem is 'Calc item (Times 2)':

'Calc Group 2 (Precedence 200)'[Calc item (Times 2)] = SELECTEDMEASURE() * 2

U kunt zien dat berekeningsgroep 1 een prioriteitswaarde van 100 heeft en berekeningsgroep 2 een prioriteitswaarde van 200 heeft.

Met behulp van SQL Server Management Studio (SSMS) of een extern hulpprogramma met XMLA-functies voor lezen/schrijven , zoals de opensource Tabular Editor, kunt u XMLA-scripts gebruiken om berekeningsgroepen te maken en de prioriteitswaarden in te stellen. Hier voegen we het volgende toe "Calc group 1 (Precedence 100)":

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 1 (Precedence 100)"
    },
    "table": {
      "name": "Calc group 1 (Precedence 100)",
      "calculationGroup": {
        "precedence": 100,
        "calculationItems": [
          {
            "name": "Calc item (Plus 2)",
            "expression": "SELECTEDMEASURE() + 2",
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 1 (Precedence 100)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

En dit script voegt "Calc group 2 (Precedence 200)" toe:

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 2 (Precedence 200)"
    },
    "table": {
      "name": "Calc group 2 (Precedence 200)",
      "calculationGroup": {
        "precedence": 200,
        "calculationItems": [
          {
            "name": "Calc item (Times 2)",
            "expression": "SELECTEDMEASURE() * 2"
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 2 (Precedence 200)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

In Power BI Desktop hebben we een kaartvisual met de meting en een slicer voor elk van de berekeningsgroepen in de rapportweergave:

Metinggroep afzonderlijke expressies.

Wanneer beide slicers zijn geselecteerd, moeten we de DAX-expressies combineren. Hiervoor beginnen we met het hoogste prioriteitsberekeningsitem, 200 en vervangen we het argument SELECTEDMEASURE() door de eerstvolgende hoogste, 100.

De DAX-expressie voor het berekeningsitem met de hoogste prioriteit is dus:

SELECTEDMEASURE() * 2 

En onze op een na hoogste prioriteitsberekeningsitem DAX-expressie is:

SELECTEDMEASURE() + 2 

Nu worden ze gecombineerd door het gedeelte SELECTEDMEASURE() van het hoogste prioriteitsberekeningsitem te vervangen door het volgende hoogste prioriteitsberekeningsitem, zoals hier:

( SELECTEDMEASURE() + 2 ) * 2

Als er dan meer berekeningsitems zijn, gaan we verder totdat we bij de onderliggende meting komen. Er zijn slechts twee berekeningsgroepen in dit model, dus we vervangen nu de SELECTEDMEASURE() door de meting zelf, zoals deze:

( ( [Measure] ) + 2 ) * 2

Zoals onze Measure = 10, is dit hetzelfde als:

( ( 10 ) + 2 ) * 2

Als er geen SELECTEDMEASURE()-argumenten meer zijn, wordt de gecombineerde DAX-expressie geëvalueerd:

( ( 10 ) + 2 ) * 2 = 24

Wanneer in Power BI Desktop beide berekeningsgroepen worden toegepast met een slicer, ziet de uitvoer van de meting er als volgt uit:

Gecombineerde expressies van maateenheidgroep.

Maar houd er rekening mee dat de combinatie op een zodanige manier is genest dat de uitvoer niet 10 + 2 * 2 = 14 is, zoals u hier ziet:

Geneste expressies van meetgroep.

Voor eenvoudige transformaties is de evaluatie van lagere naar hogere prioriteit. 10 heeft bijvoorbeeld 2 toegevoegd en wordt vermenigvuldigd met 2. In DAX zijn er functies zoals CALCULATE waarmee filters of contextwijzigingen worden toegepast op binnenste expressies. In dit geval wijzigt de hogere prioriteit een expressie met een lagere prioriteit.

Prioriteit bepaalt ook welke tekenreeks voor dynamische opmaak wordt toegepast op de gecombineerde DAX-expressie voor elke meting. De tekenreeks met dynamische opmaak van de berekeningsgroep met de hoogste prioriteit is de enige toegepaste tekenreeks. Als een meting zelf een tekenreeks met dynamische opmaak heeft, wordt deze beschouwd als een lagere prioriteit voor elke berekeningsgroep in het model.

Voorbeeld van prioriteit met gemiddelden

Laten we eens kijken naar een ander voorbeeld met hetzelfde model als in het time intelligence-voorbeeld dat eerder in dit artikel is beschreven. Maar deze keer gaan we ook een berekeningsgroep Gemiddelden toevoegen. De berekeningsgroep Gemiddelden bevat gemiddelde berekeningen die onafhankelijk zijn van traditionele tijdintelligentie, omdat ze de datumfiltercontext niet wijzigen. Ze passen alleen gemiddelde berekeningen erin toe.

In dit voorbeeld wordt een dagelijkse gemiddelde berekening gedefinieerd. Berekeningen zoals gemiddelde vaten olie per dag komen vaak voor in olie- en gastoepassingen. Andere veelvoorkomende bedrijfsvoorbeelden zijn winkelverkoop gemiddelden in de detailhandel.

Hoewel dergelijke berekeningen onafhankelijk van time intelligence-berekeningen worden berekend, is er mogelijk wel een vereiste om ze te combineren. Een gebruiker wil bijvoorbeeld vaten olie per dag YTD zien om de dagelijkse oliesnelheid van het begin van het jaar tot de huidige datum weer te geven. In dit scenario moet prioriteit worden ingesteld voor berekeningsitems.

Onze veronderstellingen zijn:

Tabelnaam is Gemiddelden.
Kolomnaam is Gemiddelde berekening.
Voorrang is 10.

Berekeningsonderdelen voor gemiddelden

Geen gemiddelde

SELECTEDMEASURE()

Dagelijks gemiddelde

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Hier volgt een voorbeeld van een DAX-query en retourtabel:

Gemiddeldenquery

EVALUATE
    CALCULATETABLE (
        SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Sales", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "No Average"
        ),
        "YTD", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "No Average"
        ),
        "Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "Daily Average"
        ),
        "YTD Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "Daily Average"
        )
    ),
    DimDate[CalendarYear] = 2012
)

Query's met gemiddelden retourneren

Gemiddelde queryresultaat

In de volgende tabel ziet u hoe de waarden van maart 2012 worden berekend.

Kolomnaam Berekening
JTD Som van verkoop voor jan, feb, mrt 2012
= 495.364 + 506.994 + 373.483
Dagelijks gemiddelde Verkoop voor maart 2012 gedeeld door aantal dagen
= 373,483 / 31
YTD dagelijks gemiddelde YTD voor maart 2012 gedeeld door aantal dagen in Jan, Feb en Mar
= 1.375.841 / (31 + 29 + 31)

Hier volgt de definitie van het YTD-berekeningselement, toegepast met voorrang 20.

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

Dit is dagelijks gemiddelde, toegepast met een prioriteit van 10.

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Aangezien de prioriteit van de Time Intelligence-berekeningsgroep hoger is dan die van de berekeningsgroep Gemiddelden, wordt deze zo breed mogelijk toegepast. De berekening YTD Dagelijks gemiddelde past YTD toe op zowel de teller als de noemer (aantal dagen) van de dagelijkse gemiddelde berekening.

Dit komt overeen met de volgende expressie:

CALCULATE(DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate)), DATESYTD(DimDate[Date]))

Niet deze expressie:

DIVIDE(CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date])), COUNTROWS(DimDate)))

Zijwaartse recursie

In het bovenstaande Time Intelligence-voorbeeld verwijzen sommige berekeningsitems naar andere in dezelfde berekeningsgroep. Dit wordt sideways recursie genoemd. YOY% verwijst bijvoorbeeld naar YOY en PY.

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

In dit geval worden beide expressies afzonderlijk geëvalueerd omdat ze verschillende berekeningsinstructies gebruiken. Andere typen recursie worden niet ondersteund.

Eén berekeningsitem in filtercontext

In ons Time Intelligence-voorbeeld heeft het PY YTD-berekeningsitem één berekeningsexpressie:

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

Het argument YTD voor de functie CALCULATE() overschrijft de filtercontext om de logica die al is gedefinieerd in het berekeningsitem YTD opnieuw te gebruiken. Het is niet mogelijk om zowel PY als YTD in één evaluatie toe te passen. Berekeningsgroepen worden alleen toegepast als één berekeningsitem uit de berekeningsgroep zich in de filtercontext bevindt.

Bestellen

Wanneer een kolom uit een berekeningsgroep in een rapport wordt geplaatst, worden berekeningsitems standaard alfabetisch gesorteerd op naam. De volgorde waarin berekeningsitems in een rapport worden weergegeven, kan worden gewijzigd door de Ordinal-eigenschap op te geven. Het specificeren van de volgorde van een berekeningselement met de eigenschap Rangschikking verandert de voorrang, de volgorde waarin berekeningselementen worden geëvalueerd, niet. Het wijzigt ook niet de volgorde waarin berekeningsitems worden weergegeven in Tabellaire modelverkenner.

Als u de rangteleigenschap voor berekeningsitems wilt opgeven, moet u een tweede kolom toevoegen aan de berekeningsgroep. In tegenstelling tot de standaardkolom waarin gegevenstype Tekst is, heeft een tweede kolom die wordt gebruikt voor het ordenen van berekeningsitems een gegevenstype Geheel getal. Het enige doel voor deze kolom is het opgeven van de numerieke volgorde waarin berekeningsitems in de berekeningsgroep worden weergegeven. Omdat deze kolom geen waarde in een rapport biedt, is het raadzaam om de eigenschap Verborgen in te stellen op Waar.

Kolom voor sorteren

Nadat een tweede kolom is toegevoegd aan de berekeningsgroep, kunt u de ordinale eigenschapswaarde opgeven voor de berekeningselementen die u wilt ordenen.

Ordinale eigenschap

Zie Berekeningsitems bestellen voor meer informatie.

Een berekeningsgroep maken

Berekeningsgroepen worden ondersteund in Visual Studio met Analysis Services Projects VSIX-update 2.9.2 en hoger. Berekeningsgroepen kunnen ook worden gemaakt met behulp van TMSL (Tabular Model Scripting Language) of de open source Tabular Editor.

Een berekeningsgroep maken met Visual Studio

  1. Klik in Tabellaire modelverkenner met de rechtermuisknop op Berekeningsgroepen en klik vervolgens op Nieuwe berekeningsgroep. Een nieuwe berekeningsgroep heeft standaard één kolom en één berekeningsitem.

  2. Gebruik Eigenschappen om de naam te wijzigen en een beschrijving in te voeren voor de berekeningsgroep, kolom en standaardberekeningsitem.

  3. Als u een DAX-formuleexpressie wilt invoeren voor het standaardberekeningsitem, klikt u met de rechtermuisknop en klikt u vervolgens op Formule bewerken om DE DAX-editor te openen. Voer een geldige expressie in.

  4. Als u meer berekeningsitems wilt toevoegen, klikt u met de rechtermuisknop op Berekeningsitems en vervolgens op Nieuw berekeningsitem.

Berekeningsitems bestellen

  1. Klik in Tabellaire modelverkenner met de rechtermuisknop op een berekeningsgroep en klik vervolgens op Kolom toevoegen.

  2. Geef de kolom Ordinaal een naam (of iets dergelijks), voer een beschrijving in en stel de eigenschap Verborgen in op Waar.

  3. Stel voor elk berekeningsitem dat u wilt bestellen de rangorde in op een positief getal. Elk getal is opeenvolgend; bijvoorbeeld, een berekeningsitem met een Ordinal-eigenschap van 1 verschijnt eerst, een Ordinal-eigenschap van 2 verschijnt als tweede, enzovoort. Berekeningsitems met de standaardinstelling -1 zijn niet opgenomen in de volgorde, maar worden weergegeven vóór geordende items in een rapport.

Overwegingen

Zodra een berekeningsgroep wordt toegevoegd aan een semantisch model, gebruiken Power BI-rapporten het gegevenstype variant voor alle metingen. Als daarna alle berekeningsgroepen uit het model worden verwijderd, worden de metingen opnieuw teruggezet naar de oorspronkelijke gegevenstypen.

Beperkingen

Beveiliging op objectniveau (OLS) die is gedefinieerd in tabellen van berekeningsgroepen, wordt niet ondersteund. OLS kan echter worden gedefinieerd in andere tabellen in hetzelfde model. Als een berekeningsitem verwijst naar een beveiligd OLS-object, wordt een algemene fout geretourneerd.

Beveiliging op rijniveau (RLS) wordt niet ondersteund. Definieer RLS op tabellen in hetzelfde model, maar niet op berekeningsgroepen zelf (direct of indirect).

Detailrijenexpressies worden niet ondersteund met berekeningsgroepen.

Slimme narratieve visuals in Power BI worden niet ondersteund met berekeningsgroepen.

Impliciete kolomaggregaties in Power BI worden niet ondersteund voor modellen met berekeningsgroepen. Als de eigenschap DiscourageImplicitMeasures momenteel is ingesteld op false (standaard), worden aggregatieopties weergegeven, maar kunnen ze niet worden toegepast. Als DiscourageImplicitMeasures is ingesteld op true, worden aggregatieopties niet weergegeven.

Bij het maken van Power BI-rapporten met behulp van LiveConnection worden tekenreeksen met dynamische indeling niet toegepast op metingen op rapportniveau.

Zie ook

DAX in tabellaire modellen
DAX-naslaginformatie