Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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ä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.
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.
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.
En FormatString-kolumn läggs till i tabellen DimCurrency och fylls med formatsträngar för respektive valuta.
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.
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:
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:
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:
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
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.
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.
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
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.
Använd Egenskaper för att ändra namnet och ange en beskrivning för beräkningsgruppen, kolumnen och standardberäkningsobjektet.
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.
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
Högerklicka på en beräkningsgrupp i Tabellmodellutforskaren och klicka sedan på Lägg till kolumn.
Ge kolumnen namnet Ordinal (eller något liknande), ange en beskrivning och ange sedan egenskapen Dold till Sant.
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å.