Sdílet prostřednictvím


Skupiny výpočtů

Platí pro: SQL Server 2019 a novější Analysis Services Azure Analysis Services Fabric/Power BI Premium

Skupiny výpočtů můžou výrazně snížit počet redundantních měr tím, že mají jako položky výpočtu vzory výrazů běžných měr. Skupiny výpočtů jsou podporovány v tabulkových modelech na úrovni kompatibility 1500 a vyšší. To zahrnuje všechny sémantické modely Power BI.

Pokud máte například 5 měr a chcete pro každou z nich vytvořit verzi z předchozího roku, použijete pro každou stejný vzor se stejnými funkcemi DAX.

[Measure 1 Prior Year] = CALCULATE([Measure 1], PARALLELPERIOD('Date'[Date], -1, YEAR))

[Measure 2 Prior Year] = CALCULATE([Measure 2], PARALLELPERIOD('Date'[Date], -1, YEAR))

[Measure 3 Prior Year] = CALCULATE([Measure 3], PARALLELPERIOD('Date'[Date], -1, YEAR))

[Measure 4 Prior Year] = CALCULATE([Measure 4], PARALLELPERIOD('Date'[Date], -1, YEAR))

[Measure 5 Prior Year] = CALCULATE([Measure 5], PARALLELPERIOD('Date'[Date], -1, YEAR))

Místo vytváření pěti dalších měr můžete použít vzor v položce výpočtu, který obsahuje zástupný symbol SELECTEDMEASURE, pomocí nějž aplikujete výraz na jakoukoli míru.

CALCULATE(SELECTEDMEASURE(), PARALLELPERIOD('Date'[Date], -1, YEAR))

Položka výpočtu se použije, když vyberete položku výpočtu ve filtru nebo řezačce, nebo ji použijete k seskupení hodnot v zobrazení.

Použití položky výpočtové skupiny v sestavě Power BI

Vytvoření skupiny výpočtů

Skupiny výpočtů je možné vytvářet mnoha způsoby.

Vytvoření skupiny výpočtů pomocí zobrazení modelu Power BI

Skupinu výpočtů můžete vytvořit v zobrazení modelu Power BI Desktopu nebo při úpravách sémantického modelu Power BI v prohlížeči.

  1. Úprava sémantického modelu
  2. Vyberte tlačítko Skupina výpočtů na pásu karet.
  3. První položka výpočtu se vytvoří za vás.
  4. Přejmenujte a upravte výraz.

Další položky výpočtu můžete uspořádat a vytvořit tak, že vyberete uzel Položky výpočtu a použijete podokno Vlastnosti. Místní nabídku uzlu výpočetní skupiny nebo položek výpočtu lze použít k vytvoření nové skupiny výpočtů. Místní nabídka každé položky výpočtu obsahuje také možnosti opětovného uspořádání těchto položek.

Další informace najdete v tématu Vytváření skupin výpočtů v Power BI.

Vytvoření skupiny výpočtů pomocí zobrazení TMDL Power BI

Skupinu výpočtů můžete vytvořit v jazyce pro definici tabulkového modelu nebo v zobrazení TMDL v Power BI Desktopu. Upravte sémantický model a použijte tento skript TMDL.

createOrReplace

	table 'Calculation group'

		calculationGroup
			precedence: 1

			calculationItem 'Calculation item' = SELECTEDMEASURE()

		column 'Calculation group column'
			dataType: string
			summarizeBy: none
			sourceColumn: Name
			sortByColumn: Ordinal

			annotation SummarizationSetBy = Automatic

		column Ordinal
			dataType: int64
			formatString: 0
			summarizeBy: sum
			sourceColumn: Ordinal

			annotation SummarizationSetBy = Automatic

Vytvoření skupiny výpočtů pomocí sady Visual Studio

Skupiny výpočtů jsou podporovány v sadě Visual Studio s dodatkem Analysis Services Projects VSIX verze 2.9.2 a novější. Skupiny výpočtů lze vytvořit také pomocí jazyka TMSL (Tabular Model Scripting Language) nebo open source tabulkového editoru.

  1. V Průzkumníku tabulkových modelů klepněte pravým tlačítkem myši na skupiny výpočtů a potom klepněte na příkaz Nová skupina výpočtů. Ve výchozím nastavení má nová skupina výpočtů jeden sloupec a jednu položku výpočtu.

  2. Pomocí vlastností můžete změnit název a zadat popis pro skupinu výpočtů, sloupec a výchozí položku výpočtu.

  3. Pokud chcete zadat výraz vzorce DAX pro výchozí položku výpočtu, klikněte pravým tlačítkem myši a potom klepněte na příkaz Upravit vzorec a otevřete editor DAX. Zadejte platný výraz.

  4. Chcete-li přidat další položky výpočtu, klepněte pravým tlačítkem myši na Položku výpočtu a potom klepněte na tlačítko Nová položka výpočtu.

Pořadí položek výpočtu

  1. V Průzkumníku tabulkových modelů klikněte pravým tlačítkem myši na skupinu výpočtů a potom klikněte na přidat sloupec.

  2. Pojmenujte sloupec Ordinal (nebo něco podobného), zadejte popis a potom nastavte Vlastnost Hidden na Hodnotu True.

  3. Pro každou výpočtovou položku, kterou chcete uspořádat, nastavte vlastnost Ordinal na kladné číslo. Každé číslo je pořadové, například položka výpočtu s pořadovou vlastností 1 se zobrazí jako první, vlastnost 2 jako druhá a tak dále. Položky výpočtu s výchozími -1 nejsou součástí řazení, ale zobrazují se před seřazenými položkami v sestavě.

Výhody

Skupiny výpočtů řeší problém ve složitých modelech, kdy může dojít k nárůstu redundantních měr pomocí stejných výpočetních postupů – což je nejběžnější u výpočtů časové inteligence. Například prodejní analytik chce zobrazit celkové tržby a objednávky od začátku měsíce do dnešního dne (MTD), od začátku čtvrtletí do dnešního dne (QTD), od začátku roku do dnešního dne (YTD), objednávky od začátku roku do dnešního dne za předchozí rok (PY) a podobně. Modelátor dat musí pro každý výpočet vytvořit samostatné míry, což může vést k desítkám měr. Pro uživatele to znamená, že musí projít mnoho opatření a použít je jednotlivě na svá hlásení.

Nejprve se podíváme na to, jak se skupiny výpočtů uživatelům zobrazují v nástroji pro vytváření sestav, jako je Power BI. Pak se podíváme na to, co tvoří skupinu výpočtů a jak se vytvářejí v modelu.

Skupiny výpočtů se zobrazují v klientech generování sestav jako tabulka s jedním sloupcem. Sloupec není jako typický sloupec nebo dimenze, místo toho představuje jednu nebo více opakovaně použitelných výpočtů nebo položky výpočtu, které lze použít na libovolnou metriku, která už byla přidána do filtru Hodnoty pro vizualizaci.

V následující animaci uživatel analyzuje prodejní data za roky 2012 a 2013. Před použitím skupiny výpočtů vypočítá běžná základní míra Sales součet celkových prodejů za každý měsíc. Uživatel pak chce použít výpočty časové inteligence, aby získal celkové tržby pro aktuální měsíc, aktuální čtvrtletí, aktuální rok atd. Bez skupin výpočtů by uživatel musel vybrat jednotlivé ukazatele časové inteligence.

Když v tomto příkladu s názvem Časové měřítko přetáhne uživatel položku Výpočet času do oblasti filtru Sloupce , zobrazí se každá položka výpočtu jako samostatný sloupec. Hodnoty pro každý řádek se počítají ze základní míry Sales.

Skupina výpočtů použitá v Power BI

Skupiny výpočtů pracují s explicitními mírami DAX. V tomto příkladu je sales explicitní míra, která už je v modelu vytvořená. Skupiny výpočtů nefungují s implicitními mírami DAX. Například v implicitních mírách Power BI se vytvoří, když uživatel přetáhne sloupce do vizuálů, aby zobrazil agregované hodnoty bez vytvoření explicitní míry. Power BI vygeneruje jazyk DAX pro implicitní míry napsané jako vložené výpočty DAX – to znamená, že implicitní míry nemůžou pracovat se skupinami výpočtů. Byla představena nová vlastnost modelu viditelná v tabulkovém objektovém modelu (TOM), OdstrahodovatImplicitMeasures. V současné době, aby bylo možné vytvořit skupiny výpočtů, musí být tato vlastnost nastavena na true. Pokud je nastavená hodnota true, Power BI Desktop v režimu Živého připojení zakáže vytváření implicitních měr.

Skupiny výpočtů také podporují dotazy MDX (Multidimensional Data Expressions). To znamená, že uživatelé Microsoft Excelu, kteří se dotazují na tabulkové datové modely pomocí jazyka MDX, můžou plně využívat skupiny výpočtů v kontingenčních tabulkách a grafech listu.

Jak fungují

Teď, když jste viděli, jak skupiny výpočtů uživatelům prospívají, podíváme se na to, jak se vytvoří příklad skupiny výpočtů časové inteligence.

Než se pustíme do podrobností, představíme si některé nové funkce DAX speciálně pro skupiny výpočtů:

SELECTEDMEASURE – výrazy používají pro položky výpočtu odkaz na míru, která je aktuálně v kontextu. V tomto příkladu je míra Sales (Prodej).

SELECTEDMEASURENAME – používá výrazy pro položky výpočtu k určení míry, která je v kontextu podle názvu.

ISSELECTEDMEASURE – používá výrazy pro položky výpočtu k určení míry, která je v kontextu, je určena v seznamu měr.

SELECTEDMEASUREFORMATSTRING – používá se výrazy pro položky výpočtu k načtení formátového řetězce míry, která je v kontextu.

Příklad časové inteligence

Název tabulky – časová inteligence
Název sloupce – výpočet času
Priorita – 20

Položky výpočtu časové inteligence

Aktuální

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

Dotaz časového měřítka

Pokud chcete otestovat tuto skupinu výpočtů, spusťte následující dotaz DAX. Poznámka: MTD, YOY a YOY% jsou z tohoto příkladu dotazu vynechány. V Power BI spusťte dotaz pomocí zobrazení dotazu DAX .

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

Vrácení dotazu časové řady

Vrácená tabulka zobrazuje výpočty pro každou použitou položku výpočtu. Například viz QTD pro březen 2012 je součet leden, únor a březen 2012.

Vrácení dotazu časové řady

Řetězce dynamického formátu

Dynamické řetězce formátu se skupinami výpočtů umožňují podmíněné použití řetězců formátu na míry bez vynucení jejich vrácení řetězců.

Tabulkové modely podporují dynamické formátování měr pomocí funkce FORMAT jazyka DAX. Funkce FORMAT má ale nevýhodu vrácení řetězce, vynucení měr, které by jinak byly číselné, aby se vrátily také jako řetězec. To může mít určitá omezení, například nepracovat s většinou vizuálů Power BI v závislosti na číselných hodnotách, jako jsou grafy.

V Power BI umožňují řetězce dynamického formátu pro míry také podmíněné použití řetězců formátu na konkrétní míru bez vynucení vrácení řetězce řetězce a bez použití skupin výpočtů. Další informace najdete v tématu Dynamické formátovací řetězce měr.

Řetězce dynamického formátu pro časové měřítko

Pokud se podíváme na výše uvedený příklad časového měřítka, všechny položky výpočtu s výjimkou yoy% by měly používat formát aktuální míry v kontextu. Například hodnota YTD vypočítaná na základní míře Prodej by měla být měna. Pokud by to byla skupina výpočtů pro něco jako základní míra Orders, formát by byl číselný. YOY%, však by měl být procento bez ohledu na formát základní míry.

Pro YOY%můžeme nahradit formátovací řetězec nastavením vlastnosti výrazu řetězce formátu na 0,00%;-0,00%;0,00%. Další informace o formátování vlastností řetězcového výrazu naleznete v tématu MDX Cell Properties - FORMAT STRING Contents.

V tomto maticového vizuálu v Power BI vidíte, že prodeje Current/YOY a Orders Current/YOY zachovají odpovídající řetězce formátu základní míry. Sales YOY% a Orders YOY% však přepíše formát řetězce, aby používal procentní formát.

Časová inteligence ve vizualizaci matice

Řetězce dynamického formátu pro převod měny

Řetězce dynamického formátu poskytují snadný převod měny. Zvažte následující datový model Adventure Works. Modeluje se pro převod měny 1:N podle definice typů převodu.

Kurz měny v tabulkovém modelu

Sloupec FormatString se přidá do tabulky DimCurrency a naplní se řetězci formátu pro příslušné měny.

Formát sloupce řetězce

V tomto příkladu je pak definována následující skupina výpočtů:

Příklad převodu měny

Název tabulky – Převod měny
Název sloupce – výpočet převodu
Priorita – 5

Položky výpočtu pro převod měny

Bez převodu

SELECTEDMEASURE()

Převedená měna

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

Formát řetězcového výrazu

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

Poznámka:

Výrazy výběru pro skupiny výpočtů se dají použít k implementaci automatického převodu měny u výpočetních skupin, aniž by bylo nutné mít dvě samostatné výpočetní položky.

Výraz formátovacího řetězce musí vrátit skalární řetězec. Pomocí nové funkce SELECTEDMEASUREFORMATSTRING se vrátí k řetězci formátu základní míry, pokud je v kontextu filtru více měn.

Následující animace ukazuje dynamický formát převodu měny metriky Sales v sestavě.

Použitý řetězec dynamického formátu převodu měny

Výrazy výběru

Výrazy výběru jsou volitelné vlastnosti definované pro skupinu výpočtů. Existují dva typy výrazů výběru:

  • multipleOrEmptySelectionExpression. Tento výraz výběru se použije v těchto případech:
    • bylo vybráno více položek výpočtu,
    • Byla vybrána ne existující položka výpočtu nebo
    • byl proveden konfliktní výběr.
  • noSelectionExpression. Tento výraz výběru se použije v případě, že skupina výpočtů není filtrována.

Oba tyto výrazy výběru mají také formátStringDefinition dynamický formát řetězcový výraz.

V souhrnu lze ve skupině výpočtů definovat následující možnosti, například pomocí TMDL:

...
table Scenarios
	calculationGroup
		...
    multipleOrEmptySelectionExpression = "replace with the DAX formula"
        formatStringDefinition = "replace with the DAX formula"
    noSelectionExpression= "replace with the DAX formula"
        formatStringDefinition = "replace with the DAX formula"
...

Poznámka:

Tyto výrazy, pokud jsou zadány, se použijí pouze pro konkrétní situace uvedené. Tyto výrazy nemají vliv na výběr jedné položky výpočtu.

Tady je přehled těchto výrazů a jejich výchozí chování, pokud není zadáno:

Typ výběru Výraz výběru není definovaný (výchozí) Definovaný výraz výběru
Jeden výběr Použije se výběr. Použije se výběr.
Vícenásobný výběr Skupina výpočtů není filtrována. Výsledek vyhodnocení multipleOrEmptySelectionExpression
Prázdný výběr Skupina výpočtů není filtrována. Výsledek vyhodnocení multipleOrEmptySelectionExpression
Bez výběru Skupina výpočtů není filtrována. Výsledek vyhodnocení noSelectionExpression

Poznámka:

Pomocí nastavení selectionExpressionBehavior modelu můžete dále ovlivnit, jakou skupinu výpočtů vrátí, když nejsou definovány výrazy výběru.

Nastavení modelu SelectionExpressionBehavior

Modely mají nastavení selectionExpressionBehavior , které umožňuje další kontrolu nad tím, jak se skupiny výpočtů v daném modelu chovají. Toto nastavení přijímá následující tři hodnoty:

  • Automatické. Toto je výchozí hodnota a je stejná jako nevisual. Tím zajistíte, že existující modely nezmění chování. Modely nad úrovní budoucí kompatibility nastavenou na automatickou budou místo toho používat vizuální. V tu chvíli bude k dispozici oznámení.
  • Nevisuální. Pokud skupina výpočtů nedefinuje výraz multipleOrEmptySelection, vrátí SELECTEDMEASURE(). Když je míra seskupována podle skupiny výpočtů, jsou hodnoty mezisoučtů skryty.
  • Vizual. Pokud skupina výpočtů nedefinuje výraz multipleOrEmptySelection, skupina výpočtů vrátí BLANK(). Při seskupení podle skupiny výpočtů se hodnoty mezisoučtu určují vyhodnocením vybrané míry v kontextu skupiny výpočtů.

Pomocí TMDL nastavte vlastnost v modelu:

createOrReplace
    model Model
        ...
        selectionExpressionBehavior: automatic | nonvisual | visual
...

Vícenásobný nebo prázdný výběr

Pokud se provede více výběrů ve stejné skupině výpočtů, skupina výpočtů vyhodnotí a vrátí výsledek multipleOrEmptySelectionExpression, pokud je definován. Pokud tento výraz nebyl definován, skupina výpočtů vrátí následující výsledek, pokud je nastavení selectionExpressionBehavior modelu nastaveno na automatické nebo nevisuální:

SELECTEDMEASURE()

Pokud je nastavení chování výběru výrazu modelu nastaveno na vizuální režim, vrátí se skupina výpočtů:

BLANK()

Podívejme se například na skupinu výpočtů s názvem MyCalcGroup, která má nakonfigurovaný multipleOrEmptySelectionExpression následujícím způsobem:

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

Teď si představte následující výběr ve skupině výpočtů:

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

V této části vybereme dvě položky ve skupině výpočtů " item1" a "item2". Jedná se o více výběrů, a proto se vyhodnocuje multipleOrEmptySelectionExpression a vrátí následující výsledek: "Filtry: item1, item2".

Dále proveďte následující výběr ve skupině výpočtů:

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

Toto je příklad prázdného výběru, protože položka4 v této skupině výpočtů neexistuje. Proto se vyhodnocuje multipleOrEmptySelectionExpression a vrátí následující výsledek: "Filters: ".

Bez výběru

NoSelectionExpression ve výpočetní skupině se použije, pokud tato skupina nebyla filtrována. Nejčastěji se používá k provádění výchozích akcí bez nutnosti, aby uživatel provedl akci, a přitom uživateli poskytuje flexibilitu k přepsání výchozí akce. Podívejme se například na automatický převod měny s americkým dolarem jako centrální základní měnou.

Skupinu výpočtů můžeme nastavit pomocí následujícího výrazu 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] ) )
        )
    )
)

Pro tento výraz také nastavíme formátStringDefinition:

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

Pokud není vybrána žádná měna, všechny měny se podle potřeby automaticky převedou na konverzní měnu (americký dolar). Navíc můžete vybrat jinou měnu, která se má převést na tuto měnu, aniž byste museli přepínat položky výpočtu, jak byste museli udělat bez noSelectionExpression.

Priorita

Priorita je vlastnost definovaná pro skupinu výpočtů. Určuje pořadí, ve které jsou skupiny výpočtů sloučeny s podkladovou mírou při použití SELECTEDMEASURE() v položce výpočtu.

Příklad priority

Podívejme se na jednoduchý příklad. Tento model má míru se zadanou hodnotou 10 a dvě skupiny výpočtů, z nichž každá má jednu položku výpočtu. Na míru použijeme položky výpočtu obou výpočetních skupin. Takto ho nastavíme:

'Measure group'[Measure] = 10

První skupina výpočtů je 'Calc Group 1 (Precedence 100)' a položka výpočtu je 'Calc item (Plus 2)':

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

Druhá skupina výpočtů je 'Calc Group 2 (Precedence 200)' a položka výpočtu je 'Calc item (Times 2)':

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

Můžete vidět, že skupina výpočtů 1 má prioritu 100 a skupina výpočtů 2 má hodnotu priority 200.

Pomocí aplikace SQL Server Management Studio (SSMS) nebo externího nástroje s funkcemi XMLA pro čtení i zápis , jako je opensourcový tabulkový editor, můžete pomocí skriptů XMLA vytvořit skupiny výpočtů a nastavit hodnoty priority. Zde přidáme "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"
          }
        }
      ]
    }
  }
}

A tento skript přidá "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"
          }
        }
      ]
    }
  }
}

V Power BI Desktopu máme vizuál karty zobrazující míru a průřez pro každou skupinu výpočtů v zobrazení sestavy:

Měření skupiny samostatných výrazů

Když vybereme oba průřezy, musíme kombinovat výrazy DAX. Začneme s položkou výpočtu s nejvyšší prioritou 200 a potom nahradíme argument SELECTEDMEASURE() dalším nejvyšším, 100.

Výraz DAX pro výpočetní položku s nejvyšší prioritou je tedy:

SELECTEDMEASURE() * 2 

Výraz DAX druhé nejvýše prioritní položky výpočtu je:

SELECTEDMEASURE() + 2 

Teď se zkombinují tak, že nahradí část SELECTEDMEASURE() položky výpočtu nejvyšší priority další položkou výpočtu s nejvyšší prioritou, například takto:

( SELECTEDMEASURE() + 2 ) * 2

Pokud existují další položky výpočtu, pokračujeme, dokud se nedostaneme k podkladové míře. V tomto modelu jsou pouze dvě skupiny výpočtů, takže teď nahradíme SELECTEDMEASURE() samotnou mírou, například takto:

( ( [Measure] ) + 2 ) * 2

Vzhledem k tomu, že míra je Measure = 10, je to stejné jako:

( ( 10 ) + 2 ) * 2

Pokud nejsou k dispozici žádné další argumenty SELECTEDMEASURE(), vyhodnocuje se kombinovaný výraz DAX:

( ( 10 ) + 2 ) * 2 = 24

Když jsou v Power BI Desktopu obě skupiny výpočtů použity s filtrem, výstup hodnoty vypadá takto:

Kombinované výrazy skupiny měr

Mějte ale na paměti, že kombinace je vnořená takovým způsobem, že výstup nebude 10 + 2 * 2 = 14, jak vidíte tady:

Vnořené výrazy skupiny měr

U jednoduchých transformací je vyhodnocení od nižší po vyšší precedenci. Například k číslu 10 se přidá 2 a potom se vynásobí 2. V jazyce DAX existují funkce, jako je CALCULATE, které u vnitřních výrazů používají filtry nebo změny kontextu. V tomto případě vyšší priorita změní výraz s nižší prioritou.

Přednost také určuje, který řetězec dynamického formátu se použije u kombinovaného výrazu DAX pro každé opatření. Dynamický formátovací řetězec skupiny výpočtů s nejvyšší prioritou je jediný aplikovaný. Pokud má samotná míra řetězec dynamického formátu, považuje se za nižší prioritu pro jakoukoli skupinu výpočtů v modelu.

Priorita s příkladem průměrů

Podívejme se na jiný příklad s použitím stejného modelu, jak je znázorněno v příkladu časové inteligence popsaného dříve v tomto článku. Tentokrát ale přidáme také skupinu výpočtů Průměry . Skupina výpočtů Průměry obsahuje průměrné výpočty, které jsou nezávislé na tradičních časových měřítkech v tom, že nemění kontext filtru kalendářních dat – pouze v něm používají průměrné výpočty.

V tomto příkladu je definován denní průměrný výpočet. Výpočty, jako jsou průměrné barely ropy za den, jsou běžné v aplikacích ropy a plynu. Mezi další běžné obchodní příklady patří průměr prodeje obchodů v maloobchodě.

I když se tyto výpočty provádějí nezávisle na výpočtech časové inteligence, může být požadavek je zkombinovat. Uživatel může například chtít zobrazit barel ropy za den YTD, aby si zobrazil denní sazbu ropy od začátku roku do aktuálního data. V tomto scénáři by měla být priorita nastavena pro položky výpočtu.

Naše předpoklady jsou:

Název tabulky je Průměry.
Název sloupce je Průměrný výpočet.
Priorita je 10.

Položky výpočtu pro průměry

Bez průměru

SELECTEDMEASURE()

Denní průměr

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Tady je příklad dotazu DAX a návratové tabulky:

Dotaz na průměry

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
)

Průměry vrácených dotazů

Průměry vrácených dotazů

Následující tabulka ukazuje, jak se vypočítají hodnoty z března 2012.

Název sloupce Výpočet
Od začátku roku Součet prodejů za leden, únor, březen 2012
= 495 364 + 506 994 + 373 483
Denní průměr Prodej za březen 2012 dělený počtem dní v březnu
= 373 483 / 31
Denní průměr YTD Od začátku roku pro březen 2012 děleno počtem dnů v lednu, únoru a březnu
= 1 375 841 / (31 + 29 + 31)

Tady je definice položky YTD výpočtu použitá s prioritou 20.

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

Tady je denní průměr, použitý s prioritou 10.

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Vzhledem k tomu, že priorita výpočtové skupiny časově inteligence je vyšší než u výpočtové skupiny Průměry, používá se v co nejširším rozsahu. Výpočet denního průměru YTD aplikuje YTD jak na čitatel, tak na jmenovatele (počet dnů) denního průměrného výpočtu.

Toto je ekvivalentem následujícího výrazu:

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

Ne tento výraz:

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

Boční rekurze

V příkladu časové řady výše odkazují některé položky výpočtu na jiné ve stejné skupině výpočtů. Tomu se říká rekurze bočních cest. Například YOY% odkazuje na YOY i PY.

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

V tomto případě se oba výrazy vyhodnocují samostatně, protože používají různé příkazy calculate. Jiné typy rekurze nejsou podporovány.

Jedna položka výpočtu v kontextu filtru

V našem příkladu časové inteligence má položka výpočtu PY YTD jeden počítaný výraz:

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

Argument YTD pro funkci CALCULATE přepíše kontext filtru, aby znovu použil logiku, která je již definovaná v položce YTD výpočtu. V jednom vyhodnocení není možné použít PY i YTD. Skupiny výpočtů se použijí pouze v případě, že jedna položka výpočtu ze skupiny výpočtů je v kontextu filtru.

Objednávání

Ve výchozím nastavení se při umístění sloupce ze skupiny výpočtů do sestavy položky výpočtu řadí abecedně podle názvu. Pořadí, ve kterém se položky výpočtu zobrazují v sestavě, lze změnit zadáním vlastnosti Ordinal. Určení pořadí položek výpočtu pomocí vlastnosti Pořadové číslo nezmění prioritu, pořadí, ve kterém se vyhodnocují položky výpočtu. Nezmění také pořadí, ve kterém se položky výpočtu zobrazují v Průzkumníku tabulkových modelů.

Chcete-li zadat pořadovou vlastnost pro položky výpočtu, je nutné přidat druhý sloupec do skupiny výpočtů. Na rozdíl od výchozího sloupce, ve kterém je datový typ Text, má druhý sloupec použitý pro řazení položek výpočtu datový typ Celé číslo. Jediným účelem tohoto sloupce je zadat číselné pořadí, ve kterém se zobrazí položky výpočtu ve skupině výpočtů. Vzhledem k tomu, že tento sloupec v sestavě neposkytuje žádnou hodnotu, je nejlepší nastavit vlastnost Hidden na Hodnotu True.

Sloupec pro řazení

Po přidání druhého sloupce do skupiny výpočtů můžete zadat hodnotu řadové vlastnosti pro položky výpočtu, které chcete uspořádat.

Ordinální vlastnost

Další informace najdete v tématu Pořadí položek výpočtu.

Úvahy

Model hodnotí změnu datového typu na variantu

Jakmile se do sémantického modelu přidá skupina výpočtů, sestavy Power BI budou pro všechny míry používat datový typ varianty . Pokud jsou následně všechny skupiny výpočtů z modelu odebrány, budou míry znovu vráceny do jejich původních datových typů.

To může způsobit , že řetězce dynamického formátu pro míry používající míru pro opakované použití zobrazí chybu. Pomocí funkce FORMAT DAX vynutíte, aby se míra varianty znovu rozpoznala jako datový typ řetězce.

FORMAT([Dynamic format string], "")

Případně můžete výraz znovu použít pro řetězce dynamického formátu s uživatelem definovanou funkcí DAX .

Chyba vizualizace při použití matematické operace na nečíselné hodnotě

Nečíselné míry se běžně používají pro dynamické názvy ve vizuálech a v řetězcích dynamického formátu pro míry. Chyba Nelze převést hodnotu ... z typu Text na typ Číselný se zobrazuje u ovlivněných vizuálů. Výraz položky výpočtu se tomu může vyhnout přidáním kontroly, která před použitím matematické operace zjistí, jestli je míra číselná. V položce výpočtu použijte ISNUMERIC .

Calculation item safe = 
    IF ( 
        // Check the measure is numeric
        ISNUMERIC( SELECTEDMEASURE() ),
            SELECTEDMEASURE() * 2,
            // Don't apply the calculation on a non-numeric measure
            SELECTEDMEASURE()
        )

Omezení

Zabezpečení na úrovni objektů (OLS) definované v tabulkách skupin výpočtů se nepodporuje. OLS je však možné definovat v jiných tabulkách ve stejném modelu. Pokud položka výpočtu odkazuje na zabezpečený objekt OLS, vrátí se obecná chyba.

Zabezpečení na úrovni řádků (RLS) se nepodporuje. Definujte RLS u tabulek ve stejném modelu, ale ne u skupin výpočtů samotných (přímo nebo nepřímo).

Výrazy řádků podrobností nejsou podporovány u skupin výpočtů.

Inteligentní prvky vyprávění v Power BI nejsou ve skupinách výpočtů podporovány.

Implicitní agregace sloupců v Power BI nejsou podporované pro modely se skupinami výpočtů. Pokud je vlastnost DiscourageImplicitMeasures nastavená na false (výchozí), zobrazí se možnosti agregace, ale nelze je použít. Pokud je hodnota DiscourageImplicitMeasures nastavená na hodnotu true, možnosti agregace se nezobrazí.

Při vytváření sestav Power BI pomocí Živého připojení se dynamické formátovací řetězce nepoužijí na míry na úrovni sestav.

Viz také

Vytváření skupin výpočtů v Power BIzobrazení TMDLzobrazení dotazu DAXDynamické formátování řetězců pro opatřeníPrůzkumník modelů v zobrazení modelu Power BIDAX v tabulkových modelech
Referenční dokumentace jazyka DAX