Dela via


Beräkningsgrupper

Gäller för: SQL Server 2019 och senare Analysis Services Azure Analysis Services Fabric/Power BI Premium

Beräkningsgrupper kan avsevärt minska antalet redundanta mått genom att gruppera vanliga måttuttryck som beräkningsobjekt. Beräkningsgrupper stöds i tabellmodeller på kompatibilitetsnivån 1500 och högre.

Fördelar

Beräkningsgrupper hanterar ett problem i komplexa modeller där det kan finnas en spridning av redundanta mått med samma beräkningar – vanligast med tidsinformationsberäkningar. En försäljningsanalytiker vill till exempel visa försäljningssummor och order per månad-till-datum (MTD), kvartal-till-datum (QTD), år-till-datum (YTD), order år-till-datum för föregående år (PY), och så vidare. Datamodelleraren måste skapa separata mått för varje beräkning, vilket kan leda till dussintals mått. För användaren kan det innebära att du måste sortera igenom lika många mått och tillämpa dem individuellt på rapporten.

Låt oss först titta på hur beräkningsgrupper visas för användare i ett rapporteringsverktyg som Power BI. Sedan tittar vi på vad som utgör en beräkningsgrupp och hur de skapas i en modell.

Beräkningsgrupper visas i rapportklienter som en tabell med en enda kolumn. Kolumnen är inte som en typisk kolumn eller dimension, utan representerar i stället en eller flera återanvändbara beräkningar eller beräkningsobjekt som kan tillämpas på alla mått som redan har lagts till i filtret Värden för en visualisering.

I följande animering analyserar en användare försäljningsdata för åren 2012 och 2013. Innan du tillämpar en beräkningsgrupp beräknar det gemensamma basmåttet Försäljning en summa av den totala försäljningen för varje månad. Användaren vill sedan använda tidsinformationsberäkningar för att få försäljningssummor för hittills i månaden, hittills i kvartalet, hittills i år och så vidare. Utan beräkningsgrupper skulle användaren behöva välja enskilda tidsinformationsåtgärder.

Med en beräkningsgrupp, i det här exemplet med namnet Time Intelligence, visas varje beräkningsobjekt som en separat kolumn när användaren drar objektet Tidsberäkning till filterområdet Kolumner . Värden för varje rad beräknas från basmåttet Försäljning.

Beräkningsgrupp som tillämpas i Power BI

Beräkningsgrupper fungerar med explicita DAX-mått. I det här exemplet är Försäljning ett explicit mått som redan har skapats i modellen. Beräkningsgrupper fungerar inte med implicita DAX-mått. I Power BI skapas implicita mått till exempel när en användare drar kolumner till visualiseringar för att visa aggregerade värden utan att skapa ett explicit mått. För närvarande genererar Power BI DAX för implicita mått skrivna som infogade DAX-beräkningar, vilket innebär att implicita mått inte kan fungera med beräkningsgrupper. En ny modellegenskap som visas i TOM (Tabular Object Model) har introducerats som heter DiscourageImplicitMeasures. För närvarande måste den här egenskapen anges till true för att kunna skapa beräkningsgrupper. När värdet är true inaktiverar Power BI Desktop i Live Connect-läge skapandet av implicita mått.

Beräkningsgrupper stöder även MDX-frågor (Multidimensional Data Expressions). Det innebär att Microsoft Excel-användare, som kör frågor mot tabelldatamodeller med hjälp av MDX, kan dra full nytta av beräkningsgrupper i pivottabeller och diagram i kalkylbladet.

Så här fungerar de

Nu när du har sett hur beräkningsgrupper gynnar användare ska vi titta på hur exemplet med tidsinformationsberäkningsgruppen som visas skapas.

Innan vi går in på detaljerna ska vi introducera några nya DAX-funktioner specifikt för beräkningsgrupper:

SELECTEDMEASURE – Används av uttryck i beräkningsobjekt för att referera till det mått som för närvarande finns i kontext. I det här exemplet mäts försäljningen.

SELECTEDMEASURENAME – Används av uttryck för beräkningsobjekt för att identifiera måttet som är i kontext genom namn.

ISSELECTEDMEASURE – Används av uttryck för beräkningsposter för att fastställa vilket mått som, i en given kontext, specificeras i en lista med mått.

SELECTEDMEASUREFORMATSTRING – Används av uttryck för beräkningsobjekt för att hämta formatsträngen för måttet som finns i kontexten.

Exempel på tidsinformation

Tabellnamn – Tidsinformation
Kolumnnamn – Tidsberäkning
Prioritet - 20

Tidsinformationsberäkningsobjekt

Nuvarande

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"
    )
)

Om du vill testa den här beräkningsgruppen kör du en DAX-fråga i SSMS eller DAX Studio med öppen källkod. Obs! YOY- och YOY-% utelämnas från det här frågeexemplet.

Tidsintelligensfråga

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 }
)

Tidsintelligensfrågesvar

Returtabellen visar beräkningar för varje beräkningsobjekt som tillämpas. Se till exempel QTD för mars 2012 är summan av januari, februari och mars 2012.

Frågeretur för tidsinformation

Strängar i dynamiskt format

Dynamiska formatsträngar med beräkningsgrupper tillåter villkorsstyrd tillämpning av formatsträngar till mått utan att tvinga dem att returnera strängar.

Tabellmodeller stöder dynamisk formatering av mått med dax-funktionen FORMAT . Funktionen FORMAT har dock nackdelen att returnera en sträng, vilket tvingar mått som annars skulle vara numeriska att även returneras som en sträng. Detta kan ha vissa begränsningar, till exempel att inte fungera med de flesta visuella Power BI-objekt beroende på numeriska värden, till exempel diagram.

I Power BI tillåter dynamiska formatsträngar för mått även villkorsstyrd tillämpning av formatsträngar till ett visst mått utan att tvinga dem att returnera en sträng och utan att använda beräkningsgrupper. Mer information finns i Dynamiska formatsträngar för mått.

Dynamiska formatsträngar för tidsinformation

Om vi tittar på exemplet med tidsinformation som visas ovan bör alla beräkningsobjekt utom YOY-% använda formatet för det aktuella måttet i kontexten. Till exempel bör YTD som beräknas på basmåttet Försäljning vara valuta. Om detta var en beräkningsgrupp för något som liknar ett basmått för Beställningar skulle formatet vara numeriskt. YOY-%bör dock vara en procentandel oavsett basmåttets format.

För YOY%kan vi åsidosätta formatsträngen genom att ange egenskapen formatsträngsuttryck till 0,00%;-0.00%;0.00%. Mer information om egenskaper för formatsträngsuttryck finns i MDX-cellegenskaper – FORMATERA STRÄNGinnehåll.

I det här matrisobjektet i Power BI ser du att Sales Current/YOY och Orders Current/YOY behåller sina respektive basmåttformatsträngar. Sales YOY% och Orders YOY% använder dock procentformat och åsidosätter därmed formatsträngen.

Tidsinformation i matrisvisualisering

Dynamiska formatsträngar för valutakonvertering

Dynamiska formatsträngar ger enkel valutakonvertering. Överväg följande Adventure Works-datamodell. Den modelleras för en-till-många-valutakonvertering som definieras av konverteringstyper.

Valutakurs i tabellmodell

En FormatString-kolumn läggs till i tabellen DimCurrency och fylls med formatsträngar för respektive valuta.

Formatera strängkolumn

I det här exemplet definieras följande beräkningsgrupp som:

Exempel på valutakonvertering

Tabellnamn – valutakonvertering
Kolumnnamn – konverteringsberäkning
Prioritet - 5

Beräkningsobjekt för valutakonvertering

Ingen konvertering

SELECTEDMEASURE()

Konverterad 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]) ) )
    )
)

Formatera stränguttryck

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

Anmärkning

Urvalsuttryck för beräkningsgrupper är för närvarande i förhandsversion och kan användas för att implementera automatisk valutakonvertering i beräkningsgrupper, vilket tar bort behovet av att ha två separata beräkningsobjekt.

Formatstränguttrycket måste returnera en skalär sträng. Den använder den nya funktionen SELECTEDMEASUREFORMATSTRING för att återgå till basmåttformatsträngen om det finns flera valutor i filterkontexten.

Följande animering visar valutakonverteringen i dynamiskt format för måttet Försäljning i en rapport.

Dynamisk formatsträng för valutakonvertering har tillämpats

Urvalsuttryck (förhandsversion)

Urvalsuttryck är valfria egenskaper som definierats för en beräkningsgrupp. Det finns två typer av urvalsuttryck:

  • multipleOrEmptySelectionExpression. Det här urvalsuttrycket tillämpas när flera beräkningsobjekt har valts, ett icke-befintligt beräkningsobjekt har valts eller när ett val i konflikt har gjorts.
  • noSelectionExpression. Det här urvalsuttrycket tillämpas när beräkningsgruppen inte filtreras.

Båda dessa urvalsuttryck har också ett formatStringDefinition dynamisk formatsträngsuttryck.

Sammanfattningsvis kan följande definieras i en beräkningsgrupp:

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

Anmärkning

Dessa uttryck, om de anges, tillämpas endast för de specifika situationer som nämns. Val för ett enda beräkningsobjekt påverkas inte av dessa uttryck.

Här är en översikt över dessa uttryck och deras standardbeteende om de inte anges:

Typ av val Urvalsuttryck inte definierat (standard) Markeringsuttryck definierat
Enkel val Urvalet tillämpas Urvalet tillämpas
Flera val Beräkningsgruppen filtreras inte Returnera resultatet av evalueringen av multipleOrEmptySelectionExpression
Tom markering Beräkningsgruppen filtreras inte Returnera resultatet av utvärderingen av multipleOrEmptySelectionExpression
Ingen markering Beräkningsgruppen filtreras inte Returnera resultatet av utvärdering av noSelectionExpression

Flera eller tomma urval

Om flera val i samma beräkningsgrupp görs utvärderas beräkningsgruppen och returnerar resultatet av multipleOrEmptySelectionExpression om det definieras. Om det här uttrycket inte har definierats returnerar beräkningsgruppen följande resultat:

SELECTEDMEASURE()

Vi ska till exempel titta på en beräkningsgrupp med namnet MyCalcGroup som har en multipleOrEmptySelectionExpression konfigurerad på följande sätt:

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

Föreställ dig nu följande val i beräkningsgruppen:

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

Här väljer vi två objekt i beräkningsgruppen, "item1" och "item2". Det här är en flervalsmarkering och därför utvärderas multipleOrEmptySelectionExpression och returnerar följande resultat: "Filter: item1, item2".

Ta sedan följande val i beräkningsgruppen:

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

Det här är ett exempel på en tom markering eftersom "item4" inte finns i den här beräkningsgruppen. Därför utvärderas multipleOrEmptySelectionExpression och returnerar följande resultat: "Filter: ".

Ingen markering

NoSelectionExpression för en beräkningsgrupp kommer att tillämpas om beräkningsgruppen inte har filtrerats. Detta används främst för att utföra standardåtgärder utan att användaren behöver vidta åtgärder samtidigt som den ger användaren flexibilitet att åsidosätta standardåtgärden. Låt oss till exempel titta på automatisk valutakonvertering med US Dollar som central pivotvaluta.

Vi kan konfigurera en beräkningsgrupp med följande 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] ) )
        )
    )
)

Vi kommer också att ange ett formatStringDefinition för det här uttrycket:

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

Om ingen valuta har valts konverteras alla valutor automatiskt till pivotvalutan (US Dollar) efter behov. Dessutom kan du fortfarande välja en annan valuta att konvertera till den valutan utan att behöva byta beräkningsobjekt som du skulle behöva göra utan noSelectionExpression.

Företräde

Prioritet är en egenskap som definierats för en beräkningsgrupp. Den anger den ordning som beräkningsgrupperna kombineras med det underliggande måttet när du använder SELECTEDMEASURE() i beräkningsobjektet.

Exempel på prioritet

Låt oss titta på ett enkelt exempel. Den här modellen har ett mått med ett angivet värde på 10 och två beräkningsgrupper, var och en med ett enda beräkningsobjekt. Vi ska tillämpa båda beräkningsgruppens beräkningsobjekt på måttet. Så här konfigurerar vi det:

'Measure group'[Measure] = 10

Den första beräkningsgruppen är 'Calc Group 1 (Precedence 100)' och beräkningsobjektet är 'Calc item (Plus 2)':

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

Den andra beräkningsgruppen är 'Calc Group 2 (Precedence 200)' och beräkningsobjektet är 'Calc item (Times 2)':

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

Du kan se att beräkningsgrupp 1 har ett prioritetsvärde på 100 och beräkningsgrupp 2 har ett prioritetsvärde på 200.

Genom att använda SQL Server Management Studio (SSMS) eller ett externt verktyg med XMLA-skrivfunktioner , som t.ex. tabellredigeraren med öppen källkod, kan du använda XMLA-skript för att skapa beräkningsgrupper och ange prioritetsvärden. Här lägger vi till "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"
          }
        }
      ]
    }
  }
}

Och det här skriptet lägger till "Calc group 2 (Precedence 200)":

{
  "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"
          }
        }
      ]
    }
  }
}

I Power BI Desktop har vi ett visuellt kort som visar måttet och ett utsnitt för var och en av beräkningsgrupperna i rapportvyn:

Mät gruppavgränsade uttryck.

När båda utsnitten är markerade måste vi kombinera DAX-uttrycken. För att göra det börjar vi med det högsta prioritetsberäkningsobjektet, 200, och ersätter sedan argumentet SELECTEDMEASURE() med det näst högsta, 100.

Därför är vårt DAX-uttryck för högsta prioritetsberäkningsobjekt:

SELECTEDMEASURE() * 2 

Och vårt näst högsta dax-uttryck för beräkningsobjektets prioritet är:

SELECTEDMEASURE() + 2 

Nu kombineras de genom att ersätta SELECTEDMEASURE() delen av det högsta prioritetsberäkningsobjektet med det näst högsta prioritetsberäkningsobjektet, så här:

( SELECTEDMEASURE() + 2 ) * 2

Om det sedan finns fler beräkningsobjekt fortsätter vi tills vi kommer till det underliggande måttet. Det finns bara två beräkningsgrupper i den här modellen, så nu ersätter vi SELECTEDMEASURE() med själva måttet, så här:

( ( [Measure] ) + 2 ) * 2

Som vår Measure = 10är detta samma som:

( ( 10 ) + 2 ) * 2

När det inte finns fler SELECTEDMEASURE()-argument utvärderas det kombinerade DAX-uttrycket:

( ( 10 ) + 2 ) * 2 = 24

När båda beräkningsgrupperna tillämpas med ett utsnitt i Power BI Desktop ser måttutdata ut så här:

Mät grupperade uttryck.

Men kom ihåg att kombinationen är kapslad på ett sådant sätt att utdata inte blir 10 + 2 * 2 = 14 som du ser här:

Mät kapslade uttryck för grupper.

För enkla transformeringar är utvärderingen från lägre till högre prioritet. Till exempel har 10 2 lagts till, sedan multipliceras det med 2. I DAX finns det funktioner som CALCULATE som tillämpar filter eller kontextändringar på inre uttryck. I det här fallet ändrar högre prioritet ett lägre prioritetsuttryck.

Prioritet avgör också vilken dynamisk formatsträng som tillämpas på det kombinerade DAX-uttrycket för varje mått. Strängen dynamiskt format för den högsta prioritetsberäkningsgruppen är den enda som tillämpas. Om ett mått i sig har en sträng i dynamiskt format anses det vara en lägre prioritet för alla beräkningsgrupper i modellen.

Prioritet med medelvärdesexempel

Nu ska vi titta på ett annat exempel med samma modell som i exemplet med tidsinformation som beskrevs tidigare i den här artikeln. Men den här gången ska vi också lägga till en beräkningsgrupp för medelvärden . Beräkningsgruppen Medelvärden innehåller genomsnittliga beräkningar som är oberoende av traditionell tidsinformation eftersom de inte ändrar datumfilterkontexten – de tillämpar bara genomsnittliga beräkningar inom den.

I det här exemplet definieras en daglig genomsnittlig beräkning. Beräkningar som genomsnittliga fat olja per dag är vanliga i olje- och gastillämpningar. Andra vanliga affärsexempel är butiksförsäljningsgenomsnittet i detaljhandeln.

Även om sådana beräkningar beräknas oberoende av tidsinformationsberäkningar kan det mycket väl finnas ett krav på att kombinera dem. En användare kanske till exempel vill se fat olja per dag hittills i år för att visa den dagliga oljeproduktionen från början av året till det aktuella datumet. I det här scenariot bör prioritet anges för beräkningsobjekt.

Våra antaganden är:

Tabellnamnet är Medelvärden.
Kolumnnamnet är Genomsnittlig beräkning.
Prioritet är 10.

Beräkningsobjekt för medelvärden

Inget genomsnitt

SELECTEDMEASURE()

Dagligt genomsnitt

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Här är ett exempel på en DAX-fråga och en returtabell:

Fråga om medelvärden

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
)

Genomsnittligt frågeresultat

Genomsnittlig frågeretur

Följande tabell visar hur värdena för mars 2012 beräknas.

Kolumnnamn Beräkning
YTD Summa av försäljning för jan, feb, mar 2012
= 495 364 + 506 994 + 373 483
Dagligt genomsnitt Försäljning för mar 2012 dividerat med antal dagar i mars
= 373 483 /31
Ytd Dagligt genomsnitt YTD för mar 2012 dividerat med antal dagar i Jan, Feb och Mar
= 1 375 841 / (31 + 29 + 31)

Här är definitionen av YTD-beräkningsobjektet som tillämpas med prioriteten 20.

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

Här är Dagligt medelvärde, tillämpat med prioriteten 10.

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Eftersom prioriteten för tidsinformationsberäkningsgruppen är högre än för beräkningsgruppen Medelvärden tillämpas den så brett som möjligt. Den dagliga genomsnittsberäkningen för YTD tillämpar YTD på både täljaren och nämnaren (antal dagar) i den dagliga genomsnittsberäkningen.

Detta motsvarar följande uttryck:

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

Inte det här uttrycket:

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

Rekursion i sidled

I exemplet Med tidsinformation ovan refererar vissa av beräkningsobjekten till andra i samma beräkningsgrupp. Detta kallas för rekursion i sidled. Yoy-% refererar till exempel till både YOY och PY.

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

I det här fallet utvärderas båda uttrycken separat eftersom de använder olika beräkningsuttryck. Andra typer av rekursion stöds inte.

Enskilt beräkningsobjekt i filterkontext

I vårt Time Intelligence-exempel har PY YTD-beräkningsobjektet ett enda beräkningsuttryck:

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

YTD-argumentet till funktionen CALCULATE() åsidosätter filterkontexten för att återanvända logiken som redan definierats i YTD-beräkningsobjektet. Det går inte att tillämpa både PY och YTD i en enda utvärdering. Beräkningsgrupper tillämpas endast om ett enda beräkningsobjekt från beräkningsgruppen finns i filterkontexten.

Beställning

När en kolumn från en beräkningsgrupp placeras i en rapport ordnas som standard beräkningsobjekt alfabetiskt efter namn. I vilken ordning beräkningsobjekt visas i en rapport kan du ändra genom att ange egenskapen Ordningsföljd. Om du anger order för beräkningsobjekt med egenskapen Ordinal ändras inte prioriteten, i vilken ordning beräkningsobjekt utvärderas. Den ändrar inte heller ordningen i vilken beräkningsobjekt visas i Tabellmodellutforskaren.

Om du vill ange ordningstalsegenskapen för beräkningsobjekt måste du lägga till en andra kolumn i beräkningsgruppen. Till skillnad från standardkolumnen där Datatyp är Text, har en andra kolumn som används för att sortera beräkningsobjekt en heltalsdatatyp. Det enda syftet med den här kolumnen är att ange den numeriska ordning i vilken beräkningsobjekt i beräkningsgruppen visas. Eftersom den här kolumnen inte innehåller något värde i en rapport är det bäst att ange egenskapen Dold till True.

Kolumn för beställning

När en andra kolumn har lagts till i beräkningsgruppen kan du ange egenskapsvärdet Ordinal för beräkningsobjekt som du vill beställa.

Ordningsegenskap

Mer information finns i Så här beställer du beräkningsobjekt.

Skapa en beräkningsgrupp

Beräkningsgrupper stöds i Visual Studio med Analysis Services Projects VSIX-uppdatering 2.9.2 och senare. Beräkningsgrupper kan också skapas med hjälp av TMSL (Tabular Model Scripting Language) eller tabellredigeraren med öppen källkod.

Så här skapar du en beräkningsgrupp med hjälp av Visual Studio

  1. Högerklicka på Beräkningsgrupper i Tabellmodellutforskaren och klicka sedan på Ny beräkningsgrupp. Som standard har en ny beräkningsgrupp en enda kolumn och ett enda beräkningsobjekt.

  2. Använd Egenskaper för att ändra namnet och ange en beskrivning för beräkningsgruppen, kolumnen och standardberäkningsobjektet.

  3. Om du vill ange ett DAX-formeluttryck för standardberäkningsobjektet högerklickar du och klickar sedan på Redigera formel för att öppna DAX-redigeraren. Ange ett giltigt uttryck.

  4. Om du vill lägga till fler beräkningsobjekt högerklickar du på Beräkningsobjekt och klickar sedan på Nytt beräkningsobjekt.

Så här beställer du beräkningsobjekt

  1. Högerklicka på en beräkningsgrupp i Tabellmodellutforskaren och klicka sedan på Lägg till kolumn.

  2. Ge kolumnen namnet Ordinal (eller något liknande), ange en beskrivning och ange sedan egenskapen Dold till Sant.

  3. För varje beräkningsobjekt som du vill beställa anger du egenskapen Ordinal till ett positivt tal. Varje tal är sekventiellt, till exempel visas ett beräkningsobjekt med en ordningstalsegenskap på 1 först, en egenskap på 2 visas som tvåa och så vidare. Beräkningsobjekt med standard--1 ingår inte i ordningen, men visas före sorterade objekt i en rapport.

Överväganden

Så snart en beräkningsgrupp har lagts till i en semantisk modell använder Power BI-rapporter variantdatatypen för alla mått. Om därefter tas alla beräkningsgrupper bort från modellen, returneras måtten till sina ursprungliga datatyper igen.

Begränsningar

Säkerhet på objektnivå (OLS) som definierats i beräkningsgruppstabeller stöds inte. OLS kan dock definieras på andra tabeller i samma modell. Om ett beräkningsobjekt refererar till ett OLS-skyddat objekt returneras ett allmänt fel.

Säkerhet på radnivå (RLS) stöds inte. Definiera RLS på tabeller i samma modell, men inte på själva beräkningsgrupperna (direkt eller indirekt).

Uttryck för detaljrader stöds inte med beräkningsgrupper.

Smarta berättelsevisualiseringar i Power BI stöds inte med beräkningsgrupper.

Implicita kolumnaggregeringar i Power BI stöds inte för modeller med beräkningsgrupper. Om egenskapen DiscourageImplicitMeasures för närvarande är inställd på false (standard) visas aggregeringsalternativ, men de kan inte tillämpas. Om DiscourageImplicitMeasures är inställt på true visas inte aggregeringsalternativ.

När du skapar Power BI-rapporter med LiveConnection tillämpas inte strängar i dynamiskt format på mått på rapportnivå.

Se även

DAX i tabellmodeller
DAX-referens