計算グループ

適用対象:SQL Server 2019 以降の Analysis Services Azure Analysis Services Fabric/Power BI Premium

計算グループを使用すると、一般的なメジャー式を計算品目としてグループ化することにより、冗長なメジャーの数を大幅に削減できます。 計算グループは、1500 以上の 互換性レベルの表形式モデルでサポートされています。

メリット

計算グループは、同じ計算を使用して冗長メジャーが急増する可能性がある複雑なモデルの問題に対処します。タイム インテリジェンス計算で最も一般的です。 たとえば、売上アナリストは、月累計 (MTD)、四半期累計 (QTD)、年累計 (YTD)、前年の受注の年累計 (PY)など、売上合計と注文を表示したいと考えています。 データ モデラーは、計算ごとに個別のメジャーを作成する必要があります。これにより、数十のメジャーが発生する可能性があります。 ユーザーの場合、これは同じ数のメジャーを並べ替え、レポートに個別に適用する必要がある可能性があります。

まず、Power BI などのレポート ツールで計算グループがどのようにユーザーに表示されるかを見てみましょう。 次に、計算グループを構成する内容と、それらがモデルでどのように作成されるかを確認します。

計算グループは、レポート クライアントでは 1 つの列を含むテーブルとして示されます。 列は一般的な列やディメンションとは似ていません。代わりに、1 つ以上の再利用可能な計算、または視覚化の [値] フィルターに既に追加されているメジャーに適用できる 計算項目 を表します。

次のアニメーションでは、ユーザーが 2012 年と 2013 年の売上データを分析しています。 計算グループを適用する前に、共通基本メジャー Sales によって各月の総売上の合計が計算されます。 その後、ユーザーはタイム インテリジェンス計算を適用して、月から日付、四半期から日付、年から日付などの売上合計を取得したいと考えています。 計算グループがない場合、ユーザーは個々のタイム インテリジェンス メジャーを選択する必要があります。

計算グループでは、この例では Time Intelligence という名前で、ユーザーが [時間計算 ] 項目を [列 ] フィルター領域にドラッグすると、各計算項目が個別の列として表示されます。 各行の値は、基本メジャー Sales から計算されます。

Power BI で適用されている計算グループ

計算グループは 、明示的な DAX メジャーで動作します。 この例では、 Sales はモデルで既に作成されている明示的なメジャーです。 計算グループは、暗黙的な DAX メジャーでは機能しません。 たとえば、Power BI では、明示的なメジャーを作成せずに、ユーザーが列をビジュアルにドラッグして集計値を表示すると、暗黙的なメジャーが作成されます。 現時点では、Power BI では、インライン DAX 計算として記述された暗黙的なメジャーに対して DAX が生成されます。つまり、暗黙的なメジャーは計算グループでは機能しません。 表形式オブジェクト モデル (TOM) に表示される新しいモデル プロパティが導入されました。 DiscourageImplicitMeasures。 現在、計算グループを作成するには、このプロパティを true に設定する必要があります。 true に設定すると、Live Connect モードのPower BI Desktopは暗黙的なメジャーの作成を無効にします。

計算グループでは、多次元データ式 (MDX) クエリもサポートされます。 つまり、MDX を使用して表形式データ モデルのクエリを実行する Microsoft Excel ユーザーは、ワークシートのピボットテーブルとグラフの計算グループを最大限に活用できます。

そのしくみ

計算グループがユーザーにどのように役立つのかを見てきたので、表示されるタイム インテリジェンス計算グループの例がどのように作成されるかを見てみましょう。

詳細に進む前に、計算グループ専用の新しい DAX 関数をいくつか紹介しましょう。

SELECTEDMEASURE - 現在コンテキストにあるメジャーを参照するために、計算項目の式で使用されます。 この例では、Sales メジャーです。

SELECTEDMEASURENAME - 名前でコンテキスト内にあるメジャーを決定するために、計算項目の式によって使用されます。

ISSELECTEDMEASURE - 計算項目の式によって使用され、コンテキスト内のメジャーがメジャーの一覧で指定されていることを確認します。

SELECTEDMEASUREFORMATSTRING - コンテキスト内のメジャーの書式指定文字列を取得するために、計算項目の式によって使用されます。

タイム インテリジェンスの例

テーブル名 - タイム インテリジェンス
列名 - 時間計算
優先順位 - 20

タイム インテリジェンスの計算項目

Current

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

前年 同期 比

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

YOY%

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

この計算グループをテストするには、SSMS またはオープンソースの DAX Studio で DAX クエリを実行します。 注: このクエリの例では、YOY と YOY% は省略されています。

タイム インテリジェンス クエリ

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

タイム インテリジェンス クエリの戻り値

戻り値テーブルには、適用された各計算項目の計算が表示されます。 たとえば、「2012 年 3 月の QTD は、2012 年 1 月、2 月、3 月の合計です」を参照してください。

タイム インテリジェンス クエリの戻り値

動的書式指定文字列

計算グループを含む動的書式指定文字列を使用すると、書式指定文字列を強制的に文字列を返すことなくメジャーに条件付きで適用できます。

表形式モデルでは、DAX の FORMAT 関数を使用したメジャーの動的な書式設定がサポートされています。 ただし、FORMAT 関数には文字列を返すという欠点があり、それ以外の場合は数値になるメジャーも文字列として返されます。 これには、グラフなどの数値に応じて、ほとんどの Power BI ビジュアルを操作しないなど、いくつかの制限があります。

Power BI では、メジャーの動的書式指定文字列を使用すると、特定のメジャーに書式指定文字列を条件付きで適用することもできます。文字列を強制的に返したり、計算グループを使用したりすることはありません。 詳細については、「 メジャーの動的書式指定文字列」を参照してください。

タイム インテリジェンスの動的書式指定文字列

上記のタイム インテリジェンスの例を見ると、 YOY% を除くすべての計算項目で、コンテキスト内の現在のメジャーの形式を使用する必要があります。 たとえば、売上基準メジャーで計算される YTD は通貨である必要があります。 これが Orders 基本メジャーなどの計算グループの場合、形式は数値になります。 ただし、YOY%は、基本メジャーの形式に関係なくパーセンテージにする必要があります。

YOY% の場合、書式指定文字列式プロパティを 0.00%;-0.00% に設定することで、書式指定文字列をオーバーライドできます。0.00% 文字列式のプロパティの書式設定の詳細については、「 MDX セルのプロパティ - FORMAT STRING Contents」を参照してください。

Power BI のこのマトリックス ビジュアルでは、 Sales Current/YOYOrders Current/YOY がそれぞれの基本メジャー書式指定文字列を保持していることがわかります。 ただし、Sales YOY%Orders YOY% は、パーセンテージ形式を使用するように書式指定文字列をオーバーライドします。

マトリックス ビジュアルのタイム インテリジェンス

通貨換算の動的書式指定文字列

動的書式指定文字列は、簡単な通貨換算を提供します。 次の Adventure Works データ モデルについて考えてみましょう。 これは、Conversion 型で定義されている 1 対多の通貨換算用にモデル化されています。

表形式モデルの通貨レート

FormatString 列が DimCurrency テーブルに追加され、それぞれの通貨の書式指定文字列が設定されます。

文字列列の書式設定

この例では、次の計算グループが として定義されます。

通貨換算の例

テーブル名 - 通貨換算
列名 - 変換計算
優先順位 - 5

通貨換算の計算項目

変換なし

SELECTEDMEASURE()

換算通貨

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

文字列式の書式設定

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

注意

計算グループの選択式は現在プレビュー段階であり、計算グループに自動通貨換算を実装するために使用できるため、2 つの個別の計算項目が必要になります。

書式指定文字列式はスカラー文字列を返す必要があります。 フィルター コンテキストに複数の通貨がある場合は、新しい SELECTEDMEASUREFORMATSTRING 関数を使用して基本メジャー書式指定文字列に戻します。

次のアニメーションは、レポート内の Sales メジャーの動的書式の通貨換算を示しています。

通貨換算の動的書式指定文字列が適用されました

選択式 (プレビュー)

選択式は、計算グループに対して定義されている省略可能なプロパティです。 選択式には、次の 2 種類があります。

  • multipleOrEmptySelectionExpression。 この選択式は、複数の計算項目が選択されている場合、既存でない計算項目が選択されている場合、または競合する選択が行われた場合に適用されます。
  • noSelectionExpression。 この選択式は、計算グループがフィルター処理されていない場合に適用されます。

どちらの選択式にも formatStringDefinition 動的書式指定文字列 式があります。

要約すると、計算グループでは、次の定義を行うことができます。

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

注意

これらの式が指定されている場合、言及されている特定の状況にのみ適用されます。 1 つの計算項目の選択は、これらの式の影響を受けません。

これらの式と、指定されていない場合の既定の動作の概要を次に示します。

選択の種類 選択式が定義されていません (既定値) 選択式の定義
単一選択 選択が適用されます 選択が適用されます
複数選択 計算グループがフィルター処理されない multipleOrEmptySelectionExpression を評価した結果を返します
空の選択 計算グループがフィルター処理されない multipleOrEmptySelectionExpression を評価した結果を返します
選択なし 計算グループがフィルター処理されない noSelectionExpression を評価した結果を返します

複数または空の選択

同じ計算グループで複数の選択が行われた場合、計算グループは評価され、定義されている場合は multipleOrEmptySelectionExpression の結果が返されます。 この式が定義されていない場合、計算グループは次の結果を返します。

SELECTEDMEASURE()

たとえば、次のように構成された multipleOrEmptySelectionExpression を持つ MyCalcGroup という名前の計算グループを見てみましょう。

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

次に、計算グループで次の選択を行う場合を想像してください。

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

ここでは、計算グループの "item1" と "item2" の 2 つの項目を選択します。 これは複数選択であるため、multipleOrEmptySelectionExpression が評価され、 "Filters: item1, item2" という結果が返されます。

次に、計算グループで次の選択を行います。

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

この計算グループに "item4" が存在しないため、空の選択の例を次に示します。 したがって、multipleOrEmptySelectionExpression が評価され、次の結果が返されます: "Filters: "

選択なし

計算グループがフィルター処理されていない場合、計算グループの noSelectionExpression が適用されます。 これは、ほとんどの場合、ユーザーが既定のアクションをオーバーライドする柔軟さをユーザーに提供しながら、アクションを実行する必要なく既定のアクションを実行するために使用されます。 たとえば、中央ピボット通貨として米ドルを使用した自動通貨換算を見てみましょう。

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

また、この式の formatStringDefinition も設定します。

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

これで、通貨が選択されていない場合、必要に応じてすべての通貨がピボット通貨 (米ドル) に自動的に変換されます。 その上で、noSelectionExpression なしで行う必要がある場合と同様に、計算項目を切り替えることなく、別の通貨を選択してその通貨に変換することもできます。

優先順位

"優先順位" は、計算グループに対して定義されるプロパティです。 計算項目で SELECTEDMEASURE() を使用する場合に、計算グループを基になるメジャーと組み合わせる順序を指定します。

優先順位の例

単純な例を見てみましょう。 このモデルには、指定された値が 10 のメジャーと、それぞれ 1 つの計算項目を持つ 2 つの計算グループがあります。 ここでは、両方の計算グループの計算項目をメジャーに適用します。 これを設定する方法は次のとおりです。

'Measure group'[Measure] = 10

最初の計算グループは で 'Calc Group 1 (Precedence 100)' 、計算項目は です 'Calc item (Plus 2)'

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

2 番目の計算グループは で 'Calc Group 2 (Precedence 200)' 、計算項目は です 'Calc item (Times 2)'

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

計算グループ 1 の優先順位の値が 100 で、計算グループ 2 の優先順位の値が 200 であることがわかります。

SQL Server Management Studio (SSMS) または XMLA 読み取り/書き込み機能を備えた外部ツール (オープンソースの表形式エディターなど) を使用すると、XMLA スクリプトを使用して計算グループを作成し、優先順位の値を設定できます。 ここでは、 を追加 "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"
          }
        }
      ]
    }
  }
}

そして、このスクリプトは を追加 "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"
          }
        }
      ]
    }
  }
}

Power BI Desktopには、レポート ビューの各計算グループのメジャーとスライサーを示すカードビジュアルがあります。

メジャー グループの個別の式。

両方のスライサーが選択されている場合は、DAX 式を組み合わせる必要があります。 これを行うには、最も優先順位の高い計算項目 200 から始めて、SELECTEDMEASURE() 引数を次に高い 100 に置き換えます。

したがって、最も優先順位の高い計算項目 DAX 式は次のとおりです。

SELECTEDMEASURE() * 2 

2 番目に優先順位の高い計算項目 DAX 式は次のとおりです。

SELECTEDMEASURE() + 2 

次に、最も優先順位の高い計算項目の SELECTEDMEASURE() 部分を次に高い優先順位の計算項目に置き換えることで結合されます。

( SELECTEDMEASURE() + 2 ) * 2

さらに計算項目がある場合は、基になるメジャーに到達するまで続行します。 このモデルには 2 つの計算グループしかないため、SELECTEDMEASURE() は次のようにメジャー自体に置き換えます。

( ( [Measure] ) + 2 ) * 2

と Measure = 10同じになります。

( ( 10 ) + 2 ) * 2

SELECTEDMEASURE() 引数がこれ以上ない場合、結合された DAX 式が評価されます。

( ( 10 ) + 2 ) * 2 = 24

Power BI Desktopでは、両方の計算グループがスライサーで適用されると、メジャーの出力は次のようになります。

メジャー グループの組み合わせ式。

ただし、この組み合わせは、次に示すように、出力が 10 + 2 * 2 = 14 にならないように入れ子になっていることに注意してください。

メジャー グループの入れ子になった式。

単純な変換の場合、評価の優先順位は低い方から高くなります。 たとえば、10 に 2 が加算され、2 が乗算されます。 DAX には、フィルターやコンテキストの変更を内部式に適用する CALCULATE などの関数があります。 この場合、優先順位が高いほど優先順位の低い式が変更されます。

また、優先順位によって、各メジャーの組み合わせ DAX 式に適用される動的書式指定文字列も決定されます。 最も優先順位の高い計算グループの動的書式指定文字列のみが適用されます。 メジャー自体に動的書式指定文字列がある場合、モデル内の計算グループの優先順位が低いと見なされます。

平均を使用した優先順位の例

この記事で前述したタイム インテリジェンスの例で示したように、同じモデルを使用する別の例を見てみましょう。 しかし今回は、 Averages 計算グループも追加しましょう。 [平均] 計算グループには、日付フィルター コンテキストを変更しないという点で、従来のタイム インテリジェンスに依存しない平均計算が含まれています。その中に平均計算を適用するだけです。

この例では、日単位の平均計算が定義されています。 石油とガスの用途では、1 日あたりの平均バレル数などの計算が一般的です。 その他の一般的なビジネス例には、小売の店舗売上平均が含まれます。

このような計算はタイム インテリジェンス計算とは無関係に計算されますが、それらを組み合わせる必要がある場合もあります。 たとえば、ユーザーは、年の初めから現在の日付までの毎日の石油率を表示するために、1 日あたりの石油のバレル YTD を表示する必要がある場合があります。 このシナリオでは、計算項目の優先順位を設定する必要があります。

私たちの前提は次のとおりです。

テーブル名は Averages です
列名は Average Calculation です。
優先順位は 10 です

平均の計算項目

平均なし

SELECTEDMEASURE()

日次平均

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

DAX クエリと戻り値テーブルの例を次に示します。

平均クエリ

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
)

平均クエリの戻り値

平均クエリの戻り値

次の表は、2012 年 3 月の値の計算方法を示しています。

列名 計算
YTD 2012 年 1 月、2 月、3 月の売上合計
= 495,364 + 506,994 + 373,483
日次平均 2012 年 3 月の売上を 3 月の日数で割った値
= 373,483 / 31
YTD 日次平均 2012 年 3 月の YTD を 1 月、2 月、3 月の日数で割った値
= 1,375,841 / (31 + 29 + 31)

優先順位 20 で適用される YTD 計算項目の定義を次に示します。

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

優先順位 が 10 の日次平均を次に示します。

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

タイム インテリジェンス計算グループの優先順位は Averages 計算グループの優先順位よりも高いため、可能な限り広く適用されます。 YTD 日次平均計算は、日次平均計算の分子と分母 (日数) の両方に YTD を適用します。

これは、次の式と同じです。

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

次の式ではありません。

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

Sideways recursion

上記のタイム インテリジェンスの例では、一部の計算項目は、同じ計算グループ内の他の項目を参照しています。 これは 横再帰と呼ばれます。 たとえば、YOY% は YOYPYの両方を参照します。

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

この場合、両方の式は異なる calculate ステートメントを使用しているため、個別に評価されます。 その他の種類の再帰はサポートされていません。

フィルター コンテキスト内の単一の計算項目

タイム インテリジェンスの例では、 PY YTD 計算項目には 1 つの計算式があります。

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

CALCULATE() 関数の YTD 引数は、YTD 計算項目で既に定義されているロジックを再利用するためにフィルター コンテキストをオーバーライドします。 PY と YTD の両方を 1 つの評価に適用することはできません。 計算グループは、計算グループの 1 つの計算項目がフィルター コンテキストにある場合 にのみ適用 されます。

順序

既定では、計算グループの列がレポートに配置されると、計算項目は名前のアルファベット順に並べ替えられます。 順序プロパティを指定することで、レポートに計算項目が表示される順序を変更できます。 序数プロパティを使用して計算項目の順序を指定しても、計算項目が評価される順序の 優先順位は変更されません。 また、テーブル モデル エクスプローラーでの計算項目の表示順序も変更されません。

計算項目の序数プロパティを指定するには、計算グループに 2 番目の列を追加する必要があります。 [データ型] が [テキスト] の既定の列とは異なり、計算項目の順序付けに使用される 2 番目の列には整数型のデータ型があります。 この列の唯一の目的は、計算グループ内の計算項目が表示される数値の順序を指定することです。 この列はレポートに値を提供しないため、 Hidden プロパティを True に設定することをお勧めします。

並べ替えの列

2 番目の列を計算グループに追加した後、注文する計算項目の序数プロパティ値を指定できます。

序数プロパティ

詳細については、「 計算項目を注文するには」を参照してください。

計算フィールドを作成する

計算グループは、Analysis Services プロジェクト VSIX 更新プログラム 2.9.2 以降を使用して Visual Studio でサポートされています。 計算グループは、表形式モデル スクリプト言語 (TMSL) またはオープンソース表形式エディターを使用して作成することもできます。

Visual Studio を使用して計算グループを作成するには

  1. [表形式モデル] エクスプローラーで、[計算グループ] を右クリックし、[新しい計算グループ] をクリックします。 既定では、新しい計算グループには 1 つの列と 1 つの計算項目があります。

  2. [プロパティ] を使用して名前を変更し、計算グループ、列、および既定の計算項目の説明を入力します。

  3. 既定の計算項目の DAX 式を入力するには、右クリックし、[数式の編集] をクリックして DAX エディターを開きます。 有効な式を入力します。

  4. 計算項目をさらに追加するには、[ 計算項目] を右クリックし、[ 新しい計算項目] をクリックします。

計算項目を注文するには

  1. [表形式モデル] エクスプローラーで、計算グループを右クリックし、[列の追加] をクリックします。

  2. 列に序数 (または類似の名前) という名前を付け、説明を入力して、 Hidden プロパティを True に設定します。

  3. 注文する計算項目ごとに、 序数 プロパティを正の数値に設定します。 各数値は連続しています。たとえば、序数プロパティが 1 の計算項目が最初に表示され、2 番目のプロパティが表示されます。 既定の -1 を持つ計算項目は順序付けには含まれませんが、レポート内の順序付きアイテムの前に表示されます。

制限事項

計算グループ テーブルで定義されているオブジェクト レベル セキュリティ (OLS) はサポートされていません。 ただし、OLS は、同じモデル内の他のテーブルで定義できます。 計算項目が OLS セキュリティで保護されたオブジェクトを参照している場合は、一般的なエラーが返されます。

行レベル セキュリティ (RLS) はサポートされていません。 同じモデル内のテーブルに RLS を定義しますが、計算グループ自体 (直接的または間接的) には定義しません。

詳細行の式 は、計算グループではサポートされていません。

Power BI のスマート説明ビジュアルは、計算グループではサポートされていません。

Power BI の暗黙的な列集計は、計算グループを持つモデルではサポートされていません。 現在、 DiscourageImplicitMeasures プロパティが false (既定値) に設定されている場合、集計オプションは表示されますが、適用できません。 DiscourageImplicitMeasurestrue に設定されている場合、集計オプションは表示されません。

LiveConnection を使用して Power BI レポートを作成する場合、動的書式指定文字列はレポート レベルのメジャーには適用されません。

こちらもご覧ください

テーブル モデルでの DAX
DAX リファレンス