次の方法で共有


テーブル モデルでの DAX

適用対象: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

Data Analysis Expressions (DAX) は、Excel の Analysis Services、Power BI、Power Pivot でカスタム計算を作成するために使用される数式言語です。 DAX の数式は、テーブル内や列内のデータに対して高度な計算を実行するための関数、演算子、値などで構成されます。

DAX は Excel の Analysis Services、Power BI、Power Pivot で使用されますが、この記事は Visual Studio で作成された Analysis Services テーブル モデル プロジェクトにさらに適用されます。

計算列、計算テーブル、メジャー、および行フィルターの DAX 数式

テーブル モデルの場合、DAX 数式は計算列、メジャー、および行フィルターで使用されます。

計算列

計算列とは、(モデル デザイナーで) 既存のテーブルに追加したら、列の値を定義する DAX 数式を作成する列です。

注意

計算列は、DirectQuery モードを使用してリレーショナル データ ソースからデータを取得するモデルではサポートされません。

計算列に有効な DAX 数式が含まれていると、数式が入力された直後に各行に対して値が計算されます。 そして、値はデータベースに格納されます。 たとえば、Date テーブルで、数式バーに「 =[Calendar Year] & " Q" & [Calendar Quarter] 」という数式を入力すると、テーブルの各行の値が計算されます。具体的には、(同じ Date テーブルの) Calendar Year 列の値にスペースと大文字の Q が付加され、さらに (同じ Date テーブルの) Calendar Quarter 列の値が付加されます。 計算列の各行の結果が直ちに計算されて、たとえば、" 2010 Q1" と表示されます。 データが再処理された場合に限り、列の値が再計算されます。

詳細については、「 計算列」を参照してください。

計算テーブル

計算テーブルは、DAX クエリまたは式に基づく計算オブジェクトであり、同じモデル内の他のテーブルのすべてまたは一部から派生します。

詳細については、「 計算テーブル」を参照してください。

メジャー

メジャーは、コンテキストに応じて結果が変化する動的な数式です。 メジャーは、Power BI レポートや Excel ピボットテーブル、ピボットグラフなどの複数の属性を使用したモデル データの組み合わせとフィルター処理をサポートするレポート形式で使用されます。 メジャーは、Visual Studio のモデル デザイナーでメジャー グリッド (および数式バー) を使用してモデル作成者によって定義されます。

メジャーの数式で、COUNT や SUM など、オート SUM 機能を使用して自動的に作成された標準の集計関数を使用することも、DAX を使用して独自の数式を定義することもできます。 数式バーでメジャーの数式を定義すると、現在のコンテキスト全体に対する結果のプレビューがツールヒント機能を使用して表示されます。ただし、それ以外の結果はすぐには表示されません。 メジャーに関するその他の詳しい情報は、 [プロパティ] ペインに表示されます。

(フィルターされた) 計算結果をすぐに確認できない理由は、コンテキストがない限りメジャーの結果が決定されないためです。 メジャーを評価するには、各セルに関連するデータを取得して、各セルの式を評価するために必要なコンテキストを提供できるレポート クライアント アプリケーションが必要です。 そのクライアントは、Excel ピボットテーブルまたはピボットグラフ、Power BI レポート、または MDX クエリである可能性があります。 レポート クライアントにかかわらず、結果では各セルについて個別のクエリが実行されます。 つまり、ピボットテーブルの行/列ヘッダーの各組み合わせ、あるいは Power BI レポート内のスライサーとフィルターの各選択により、さまざまなデータ サブセットが生成され、それに対してメジャーが計算されます。 たとえば、数式を含むメジャーでは、 Total Sales:=SUM([Sales Amount])ユーザーがピボットテーブルの [値] ウィンドウに TotalSales メジャーを配置し、DimProduct テーブルの DimProductCategory 列を [フィルター] ウィンドウに配置すると、製品カテゴリごとに Sales Amount の合計が計算されて表示されます。

計算された列/行フィルターとは異なり、メジャーの構文には、数式の前に付けられるメジャーの名前が含まれます。 指定した例では、数式の前に Total Sales: という名前が表示されます。 メジャーの作成が終了すると、名前と定義がレポート クライアント アプリケーションのフィールド リストに表示され、パースペクティブとロールに応じて、モデルのすべてのユーザーがメジャーを利用できるようになります。

詳細は、Measures を参照してください。

行フィルター

行フィルターは、テーブル内のどの行が特定のロールのメンバーに表示されるのかを指定します。 行フィルターは、DAX 式を使用してモデル内の各テーブルに対して作成できます。 Visual Studio のロール マネージャーを使用して、特定のロールの行フィルターを作成します。 SQL Server Management Studio (SSMS) のロール プロパティを使用して、デプロイされたモデルに対して行フィルターを定義することもできます。

行フィルターでは、DAX の数式 (これはブール値の TRUE/FALSE 条件に評価される必要がある) により、その特定のロール メンバーがクエリ結果を返す行が定義されます。 DAX の数式に含まれていない行は返されません。 たとえば、Sales ロールのメンバーの場合、 =Customers[Country] = "USA"という DAX 式を持つ Customers テーブルでは、米国内の顧客データのみを表示でき、SUM などの集計は米国内の顧客だけを対象にした値を返します。

DAX の数式を使用して行フィルターを定義する場合、許可済みの行セットを作成していることになります。 他の行へのアクセスを拒否するものではありません。もっと正確に言えば、許可される行セットの一部として単純に返されることはありません。 他のロールでは、DAX 数式で除外された行にアクセスできます。 ユーザーが別のロールに属するとき、そのロールの行フィルターで特定の行セットへのアクセスが許可される場合、そのユーザーはその行のデータを表示できます。

行フィルターは、指定行と関連行に適用されます。 テーブルに複数のリレーションシップがあるとき、アクティブなリレーションシップに対してフィルターによりセキュリティが適用されます。 行フィルターには、関連テーブルに対して定義された他の行フィルターと類似する点があります。

詳細は、ロール を参照してください。

DAX のデータ型

多様なデータ型をサポートするさまざまなデータ ソースから、モデルにデータをインポートできます。 モデルにデータをインポートする場合、そのデータはいずれかのテーブル モデル データ型に変換されます。 モデル データが計算に使用される場合、そのデータは計算中および計算の出力時に DAX データ型に変換されます。 DAX の数式を作成すると、数式に使用されている語句によって、返される値のデータ型が自動的に判断されます。

テーブル モデルと DAX の組み合わせでは、次のデータ型がサポートされます。

モデルでのデータ型 DAX のデータ型 説明
整数 64 ビット (8 バイト) の整数値 1、2 小数点以下を含まない数値。 整数は正の数値または負の数値のどちらも有効ですが、-9,223,372,036,854,775,808 (-2^63) ~ 9,223,372,036,854,775,807 (2^63-1) の範囲の整数でなければなりません。
10 進数 64 ビット (8 バイト) の実数 1、2 小数点以下を含む数値。 実数では次のような幅広い値が有効です。

負の値 (-1.79E +308 ~ -2.23E -308 の範囲)

ゼロ

正の値 (2.23E -308 ~ 1.79E + 308 の範囲)

ただし、有効桁数は小数点以下が 17 桁に制限されます。
ブール値 Boolean True または False の値。
Text String Unicode 文字データ文字列。 文字列、数字、またはテキスト形式で表現される日付を使用できます。
日付 日付/時刻 許容された日付時刻表現による日付および時刻。

1900 年 3 月 1 日より後のすべての日付が有効です。
通貨 通貨 通貨データ型では、-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の範囲の値 (小数点以下が 4 桁で有効桁数が固定長) が有効です。
該当なし 空白 空白は、DAX では SQL の NULL に相当するデータ型です。 空白を作成するには BLANK 関数を使用し、空白かどうかをテストするには論理関数の ISBLANK を使用します。

テーブル モデルには、多くの DAX 関数の入力または出力として使用される Table データ型が含まれています。 たとえば、FILTER 関数は、入力としてテーブルを受け取り、フィルター条件を満たした行のみを含んだ別のテーブルを出力します。 テーブル関数と集計関数を組み合わせることにより、動的に定義されるデータセットに対して複雑な計算を実行することができます。

通常、データ型は自動的に設定されますが、データ型とは何か、それらが特に DAX の数式においてどのように利用されているかを知ることは大切です。 たとえば、式のエラーや予期しない結果は、データ型に対して使用できない特定の演算子を引数に指定したことが原因で発生することが少なくありません。 たとえば、「 = 1 & 2」という数式では、文字列の結果 (12) が返されます。 これに対し、「 = "1" + "2"」という数式では、整数の結果 (3) が返されます。

表形式モデルのデータ型と DAX でのデータ型の明示的および暗黙的な変換の詳細については、「 サポートされているデータ型」を参照してください。

DAX 演算子

DAX 言語では、次の 4 種類の計算演算子が数式に使用されます。

  • 比較演算子: 値を比較して論理 TRUE/FALSE 値を返します。
  • 算術演算子: 数値を返す算術計算を実行します。
  • テキスト連結演算子: 2 つ以上のテキスト文字列を結合します。
  • 論理演算子: 複数の式を組み合わせて 1 つの結果を返します。

DAX 式で使用される演算子の詳細については、「 DAX 演算子リファレンス」を参照してください。

DAX の数式

計算列やメジャーに使用する計算を作成したり、行レベルのフィルターを使用してデータのセキュリティを確保するうえで、DAX の数式は欠かすことができません。 計算列/メジャーの数式を作成するには、モデル デザイナー ウィンドウまたは DAX エディターの上部にある数式バーを使用します。 行フィルターに使用する数式を作成するには、[ロール マネージャー] ダイアログ ボックスを使用します。 このセクションの情報は、DAX 数式の基本をご理解いただくことを目的としています。

数式の基本

DAX を使用すると、計算列の一部として、およびテーブルに関連付けられているメジャー (テーブルには直接表示されない) として、テーブル モデルの作成者がカスタム計算をモデル テーブルに定義できます。 また、モデル作成者がデータのセキュリティを確保できるのも DAX の利点です。ブール値を返す計算を作成し、特定の (または関連する) テーブルに関連付けられているロールのメンバー ユーザーがそのテーブルからクエリできる行を定義することができます。

DAX はとても単純にすることもかなり複雑にすることもできます。 次の表は、計算列で使用できる単純な数式の例をまとめたものです。

Formula 説明
=TODAY() 今日の日付をすべての行の列に挿入します。
=3 値 3 を列のすべての行に挿入します。
=[Column1] + [Column2] [Column1] と [Column2] の同じ行の値を加算し、同じ行の計算列に結果を入れます。

作成する数式が単純でも複雑でも関係なく、次の手順で数式を作成できます。

  1. 各数式は等号から始める必要があります。

  2. 関数名を入力または選択できます。あるいは、数式を入力できます。

  3. 関数または求める名前の最初の数文字を入力すると、オートコンプリートにより、該当する関数、テーブル、列が一覧表示されます。 TAB キーを押すと、オートコンプリートの一覧から数式に項目が追加されます。

    [Fx] ボタンをクリックする方法でも、利用できる関数の一覧を表示できます。 ドロップダウン リストから関数を選択するには、矢印キーで項目を強調表示し、 [OK] をクリックして関数を数式に追加します。

  4. 使用できるテーブルや列のドロップダウン リストから引数を選択するか、値を入力することで引数を関数に指定できます。

  5. 構文エラーの確認: かっこがすべて閉じられていることと、列、テーブル、値の参照が正しいことを確認します。

  6. 指定した数式で問題なければ、ENTER キーを押します。

注意

計算列では、入力された数式の有効性が確認された直後、列に値が入力されます。 メジャーの場合は、Enter キーを押すと、メジャー グリッドのメジャー定義がテーブルと共に保存されます。 数式が無効な場合は、エラーが表示されます。

次に示したのは、Days in Current Quarter という名前のメジャーに含まれる、より複雑な式の例です。

Days in Current Quarter:=COUNTROWS( DATESBETWEEN( 'Date'[Date], STARTOFQUARTER( LASTDATE('Date'[Date])), ENDOFQUARTER('Date'[Date])))  

このメジャーは、未完了の期間と前の期間との比較比率を作成するために使用されます。 この数式では、経過した期間の比率を考慮し、それを前期間の同じ比率と比較する必要があります。 この場合、[Days Current Quarter to Date]/[Days in Current Quarter] から、現在の期間の経過比率が得られます。

この数式には、次の要素が含まれています。

数式要素 Description
Days in Current Quarter:= メジャーの名前。
= 等号 (=) で数式が始まります。
COUNTROWS COUNTROWS 関数は、Date テーブル内の行数をカウントします。
() 始めかっこと閉じかっこにより引数が指定されます。
DATESBETWEEN DATESBETWEEN 関数では、Date テーブルの Date 列の値ごとに、最後の日との間の日付が返されます。
'Date' Date テーブルを指定します。 テーブルは一重引用符で囲みます。
[Date] Date テーブルの Date 列を指定します。 列は角かっこで囲みます。
,
STARTOFQUARTER STARTOFQUARTER 関数では、四半期の開始日が返されます。
LASTDATE LASTDATE 関数では、四半期の終了日が返されます。
'Date' Date テーブルを指定します。
[Date] Date テーブルの Date 列を指定します。
,
ENDOFQUARTER ENDOFQUARTER 関数
'Date' Date テーブルを指定します。
[Date] Date テーブルの Date 列を指定します。

数式にオートコンプリートを使用する

モデル デザイナーの数式バーと数式の行フィルター ウィンドウ ([ロール マネージャー] ダイアログ ボックス) には、どちらもオートコンプリート機能が備わっています。 オートコンプリート機能によって、数式の各要素が選択肢として表示されるため、有効な式構文を効率的に入力することができます。

  • 数式のオートコンプリート機能は、関数が入れ子になっている既存の数式の途中で使用できます。 挿入ポイントの直前のテキストが、ドロップダウン リストに値を表示するために使用されます。挿入ポイントより後ろのすべてのテキストは変更されません。

  • オートコンプリートには、関数の閉じかっこを追加する機能や、かっこを自動的に照合する機能はありません。 数式を保存または使用するには、各関数の構文に誤りがないことをユーザー自身が確認する必要があります。

数式で複数の関数を実行する

関数は入れ子にすることができます。つまり、ある関数の結果を別の関数の引数として使用できます。 計算列では、最大で 64 レベルの関数を入れ子にできます。 ただし、入れ子化によって数式の作成やトラブルシューティングが困難になることがあります。

多くの関数は、入れ子になった関数としてのみ使用されるように設計されています。 これらの関数はテーブルを返します。このテーブルは、結果として直接保存することはできませんが、入力としてテーブル関数に渡す必要があります。 たとえば、SUMX 関数、AVERAGEX 関数、および MINX 関数には、第 1 引数としてテーブルが必要です。

注意

メジャーでは、関数の入れ子化にいくつかの制限があります。これらの制限は、列間の依存関係から必要になる多数の計算によるパフォーマンスへの影響を防ぐために設けられています。

DAX 関数

ここでは、DAX でサポートされる関数の 種類 の概要について説明します。 詳細については、「 DAX 関数リファレンス」を参照してください。

DAX には、日時を使った計算、条件値の作成、文字列の操作、リレーションシップに基づく参照を行うことのできる各種関数に加え、テーブル全体で繰り返し実行して再帰的な計算を行う機能が用意されています。 これらの関数の多くは、Excel の数式と非常によく似ています。ただし、DAX の数式は、次の点が大きく異なります。

  • DAX 関数は、常に列全体またはテーブル全体を参照します。 テーブルまたは列の特定の値のみを使用する場合は、数式にフィルターを追加できます。

  • 行ごとに計算をカスタマイズする場合は、現在の行の値か関連する値を一種のパラメーターとして使用できる DAX の関数を使用します。これによって、コンテキストによって変化する計算を実行できます。 これらの関数のしくみを理解するには、この記事で後述する「DAX 数式のコンテキスト」を参照してください。

  • DAX には、値ではなくテーブルを返す多くの関数が含まれています。 テーブルはレポート クライアントには表示されませんが、他の関数の入力として使用されます。 たとえば、テーブルを取得して、含まれる個別値をカウントしたり、フィルター処理されたテーブルまたは列における動的な合計を計算したりすることができます。

  • DAX 関数には、さまざまな タイム インテリジェンス 関数が含まれます。 これらの関数を使用すると、日付範囲を定義または選択して、それらの日付または範囲に基づく動的な計算を実行できます。 たとえば、並列期間の合計を比較できます。

日付と時刻関数

DAX の日付と時刻の関数は、Microsoft Excel の日付と時刻の関数に似ています。 ただし、DAX 関数は、Microsoft SQL Server で使用される datetime データ型に基づいています。 詳細については、「 日付と時刻関数 (DAX)」を参照してください。

フィルター関数

DAX のフィルター関数を使用すると、特定のデータ型を返したり、関連テーブルで値を参照したり、関連する値によるフィルターを適用したりすることができます。 参照関数では、データベースと同様、テーブルおよびリレーションシップを使用します。 フィルター関数を使用すると、データ コンテキストを操作して動的な計算を作成できます。 詳細については、「 フィルター関数 (DAX)」を参照してください。

情報関数

情報関数は、引数として渡されたセルまたは行を参照し、値が必要な型と一致するかどうかを通知します。 たとえば、ISERROR 関数は、参照する値にエラーが含まれている場合に TRUE を返します。 詳細については、「 Information Functions (DAX)」を参照してください。

論理関数

論理関数は、式に対して操作を実行し、その式の値に関する情報を返します。 たとえば、TRUE 関数を使用すると、評価している式から TRUE 値が返されるかどうかを確認できます。 詳細については、「 論理関数 (DAX)」を参照してください。

数学関数と三角関数

DAX の数学関数は、Excel の数学関数や三角関数と非常によく似ています。 ただし DAX 関数で使用する数値データ型には、小さな違いがいくつかあります。 詳細については、「 数学関数と Trig 関数 (DAX)」を参照してください。

その他の関数

その他の関数では、他のほとんどの関数が属するカテゴリでは定義できない独自のアクションを実行します。 詳細については、「 その他の関数 (DAX)」を参照してください。

統計関数

DAX には、集計を行う統計関数があります。 DAX では、集計と平均の作成や最小値と最大値の特定に加えて、集計前に列をフィルター処理したり、関連テーブルに基づき集計を作成したりすることができます。 詳細については、「 統計関数 (DAX)」を参照してください。

文字列関数

DAX の文字列関数は、Excel の文字列関数と非常によく似ています。 文字列の一部を返したり、文字列内のテキストを検索したり、文字列値を連結したりすることができます。 さらに、DAX には日付、時刻、数値の形式を制御する関数も用意されています。 詳細については、「 テキスト関数 (DAX)」を参照してください。

タイム インテリジェンス関数

DAX に含まれるタイム インテリジェント関数を使用すると、カレンダーおよび日付に関して組み込まれた知識を使用する計算を作成できます。 時刻と日付の範囲を集計や計算と組み合わせて使用することで、売上、在庫などの比較可能な期間に対して意味のある比較を作成できます。 詳細については、「 タイム インテリジェンス関数 (DAX)」を参照してください。

テーブル値関数

DAX 関数には、テーブルを出力する関数、入力としてテーブルを受け取る関数、またはその両方を行う関数が存在します。 テーブルに含めることができるのは 1 列であるため、テーブル値関数も入力として 1 列を受け取ります。 DAX の数式を最大限に活用するには、このようなテーブル値関数の使い方を理解することが大切です。 DAX には、次の種類のテーブル値関数があります。

フィルター関数 - 現在の行に関連する列、テーブル、または値を返します。

集計関数 - テーブルの行に対して任意の式を集計します。

タイム インテリジェンス関数 - 日付のテーブルを返すか、日付のテーブルを使用して集計を計算します。

DAX 数式のコンテキスト

DAX を使用して数式を作成する場合、コンテキスト の概念を理解することが重要です。 コンテキストを使用すると動的分析を行うことができます。数式の結果は、現在の行またはセルの選択や関連データを反映して変化するためです。 高性能な動的分析の作成や、数式に関する問題のトラブルシューティングを行うには、コンテキストをよく理解して効果的に使用することが重要です。

テーブル モデルの数式は、次のような設計要素に対応して、さまざまなコンテキストで評価されます。

  • ピボットテーブルやレポートに適用されるフィルター

  • 数式内で定義されているフィルター

  • 数式内で特別な関数を使用して指定されたリレーションシップ

コンテキストには、 行コンテキストクエリ コンテキストフィルター コンテキストという種類があります。

行コンテキスト

"行コンテキスト" とは、"現在の行" と考えることができます。 計算列に数式を作成した場合、その数式の行コンテキストは、現在の行内の全列からの値を含んでいます。 テーブルが別のテーブルに関連付けられている場合、コンテキストには、現在の行に関連付けられている他のテーブルの値もすべて含まれます。

たとえば、同じテーブルの Freight と Tax の 2 つの列の値を加算する =[Freight] + [Tax]という計算列を作成したとします。 この数式は、指定した列の現在の行の値のみを自動的に取得します。

行コンテキストは、テーブル間に定義されたリレーションシップ (DAX 数式を使用して計算列に定義されているリレーションシップも含む) を使用して、関連するテーブルのどの行が現在の行に関連付けられているかを判別します。

たとえば次の数式は、RELATED 関数を使用し、注文の出荷先の地域に基づいて、関連テーブルから税の値をフェッチします。 現在のテーブル内の地域の値を使用し、関連するテーブルで地域を探し、関連するテーブルから該当する地域の税率を取得することによって、税の値が求められます。

= [Freight] + RELATED('Region'[TaxRate])  

この数式は、Region テーブルから現在の地域の税率を取得し、Freight 列の値に加算します。 DAX の数式では、テーブルどうしを関連付ける特定のリレーションシップを知る必要や指定する必要はありません。

複数行のコンテキスト

DAX には、テーブルで計算を繰り返し実行する関数が含まれています。 これらの関数は、現在の行と、それぞれの行コンテキストを持つことができます。 基本的には、これらの関数を使用すると、内側ループと外側ループに関して再帰的に実行する数式を作成できます。

たとえば、 ProductsSales という 2 つのテーブルがブックに含まれている場合に、 複数の製品に関連する取引が多数存在する sales テーブル全体から、各製品の 1 回の取引あたりの最大注文数を検索するとします。

DAX を使用すると、正しい値を返す 1 つの数式を作成でき、データをテーブルに追加すると結果が自動的に更新されます。

=MAXX(FILTER(Sales,[ProdKey]=EARLIER([ProdKey])),Sales[OrderQty])  

この数式の詳細なチュートリアルについては、「 EARLIER 関数 (DAX)」を参照してください。

つまり、EARLIER 関数は、現在の操作に先行する操作からの行コンテキストを格納します。 この関数は常に、メモリに 2 つのコンテキスト セットを格納します。1 つのコンテキスト セットは、数式の内側のループに対する現在行を表し、もう一方のセットは、数式の外側のループに対する現在行を表します。 DAX では、2 つのループの間で値が自動的に提供されるので、複雑な集計を作成することができます。

クエリ コンテキスト

クエリ コンテキスト とは、数式に対して暗黙的に取得されるデータのサブセットを指します。 テーブル モデルに基づくレポートまたはピボットテーブルに、メジャーまたは他の値のフィールドを配置すると、エンジンが、行見出しと列見出し、スライサー、およびレポート フィルターを調べてコンテキストを決定します。 次に、必要なクエリがデータ ソースに対して実行され、データの正しいサブセットを取得し、数式で定義された計算を行い、ピボットテーブルの各セルまたはレポートに値を含めます。 取得されるデータのセットは、各セルのクエリ コンテキストです。

警告

DirectQuery クエリ モードのモデルでは、コンテキストが評価されると、データの正しいサブセットを取得して結果を計算するセット演算が、SQL ステートメントに変換されます。 これらのステートメントは、直接リレーショナル データ ストアに対して実行されます。 したがって、データを取得して結果を計算する方法は異なりますが、コンテキストそのものは変わりません。

数式を置く場所に基づいてコンテキストは変わるため、数式の結果も変わることがあります。

たとえば、Sales テーブルの Profit 列の値を合計する数式 =SUM('Sales'[Profit]) を作成するとします。 Sales テーブル内の計算列でこの数式を使用した場合、数式の結果はテーブル全体で同じになります。数式のクエリ コンテキストが常に、Sales テーブルのデータ セット全体になるからです。 結果は、全地域、全製品、全年度などを対象とする利益になります。

ただし、ユーザーは通常、同じ結果を何百回も表示するのではなく、特定の年、特定の国/地域、特定の製品、またはこれらの組み合わせの利益を得てから、総計を得たいと考えています。

実際、ピボットテーブルで、列ヘッダーや行ヘッダー、スライサーを追加したり削除したりすると、コンテキストが変わります。 ピボットテーブルに列または行の見出しを追加するたびに、メジャーが評価されるクエリ コンテキストが変化します。 スライス操作やフィルター処理もコンテキストに影響を及ぼします。 したがって、メジャーで使用される同じ数式は、セルごとに異なる クエリ コンテキスト で評価されます。

フィルター コンテキスト

フィルター コンテキスト は、各列が含むことができる値のセット、または関連するテーブルから取得される値が含むことができる値のセットです。 フィルターを適用できるのは、デザイナーまたはプレゼンテーション層 (レポートおよびピボットテーブル) の列です。 また、数式内のフィルター式によって明示的に定義することもできます。

フィルター コンテキストは、数式の引数を使用して列やテーブルの使用可能な値のセットにフィルター制約を指定すると追加されます。 行コンテキストやクエリ コンテキストなど、他のコンテキストに加えて適用されます。

テーブル モデルには、フィルター コンテキストを作成する多くの方法があります。 Power BI レポートなど、モデルを使用できるクライアントのコンテキスト内では、行と列の見出しにスライサーやレポート フィルターを追加することで、ユーザーはその場でフィルターを作成できます。 数式にフィルター式を直接指定することもできます。それにより、関連する値を指定したり、入力として使用されるテーブルにフィルターを設定したり、計算で使用される値のコンテキストを動的に取得したりします。 また、フィルターを完全にクリアしたり、特定の列のフィルターを選択的にクリアしたりすることもできます。 これは、総計を計算する数式を作成するときに非常に便利です。

数式内でフィルターを作成する方法については、「FILTER 関数 (DAX)」を参照してください。

フィルターをクリアして総計を作成する方法の例については、「 ALL 関数 (DAX)」を参照してください。

数式内のフィルターを選択的にクリアして適用する方法の例については、「 ALLEXCEPT 関数 (DAX)」を参照してください。

数式のコンテキストを特定する

DAX 数式を作成すると、構文が有効かどうかが最初にテストされます。次に、数式に含まれる列やテーブルの名前が現在のコンテキストで見つかるかどうかがテストされます。 数式に指定された列またはテーブルが見つからない場合は、エラーが返されます。

検証中のコンテキスト (および再計算操作) は、前のセクションで説明したように、モデル内の使用可能なテーブル、テーブル間のリレーションシップ、および適用されたフィルターを使用して決定されます。

たとえば、新しいテーブルにデータをインポートしたばかりで、そのテーブルが他のテーブルには関連していない場合 (フィルターもまだ適用していない場合)、 現在のコンテキスト はテーブルの列セット全体になります。 テーブルがリレーションシップによって別のテーブルに関連付けられている場合、現在のコンテキストには、関連付けられているテーブルも含まれます。 このテーブルの列をレポートに追加し、そのレポートにスライサーとレポート フィルターが含まれる場合、数式のコンテキストは、レポートの各セルのデータのサブセットになります。

コンテキストは、数式のトラブルシューティングも困難にする可能性がある強力な概念です。 コンテキストの動作を理解するには、単純な数式とリレーションシップから始めることをお勧めします。 次のセクションでは、数式でさまざまなタイプのコンテキストを使用して動的に結果を返す方法の例も示します。

数式のコンテキストの例

RELATED 関数 (DAX) は、関連列の値が含まれるように現在の行のコンテキストを拡大します。 これにより、参照を実行できます。 この記事の例では、フィルター処理と行コンテキストの相互作用を示します。

FILTER 関数 (DAX) を使用すると、現在のコンテキストに含める行を指定できます。 この記事の例では、集計を実行する他の関数にフィルターを埋め込む方法についても説明します。

ALL 関数 (DAX) は、数式内でコンテキストを設定します。 この関数を使用すると、クエリ コンテキストの結果として適用されたフィルターをオーバーライドできます。

ALLEXCEPT 関数 (DAX) を使用すると、指定した以外のすべてのフィルターを削除できます。 どちらの記事にも、数式の作成と複雑なコンテキストの理解について説明する例が含まれています。

EARLIER 関数 (DAX)EARLIEST 関数 (DAX) を使用すると、内側のループの値を参照しながら計算を実行してテーブルをループ処理することができます。 再帰の概念や内側と外側のループについてよく知っている場合は、このトピックを読むと EARLIER および EARLIEST 関数の威力がわかります。 これらの概念についてよく知らなくても、例の手順に注意して従うことで、計算で内側と外側のコンテキストがどのように使用されるのかを理解できます。

数式と表形式モデル

Visual Studio のモデル デザイナーは、複数のデータ テーブルを操作し、テーブル モデル内のテーブルを接続できる領域です。 このモデルでは、共通の値 (キー) を含む列のリレーションシップによってテーブルが結合されます。 テーブル モデルでは、他のテーブルの列に値をリンクして、より有益な計算を行うことができます。 リレーショナル データベースと同様に、関連するテーブルの多くのレベルを結び付け、任意のテーブルの列を結果で使用できます。

たとえば、売上テーブル、製品テーブル、および製品カテゴリ テーブルをリンクすると、ユーザーは、ピボットテーブルやレポートで、列のさまざまな組み合わせを使用できます。 関連するフィールドは、接続されたテーブルをフィルター処理したり、サブセットに対する計算を作成したりするために使用できます (リレーショナル データベースに慣れていない場合や、テーブルと結合を操作する場合は、「 リレーションシップ」を参照してください)。

テーブル モデルでは、複数のテーブル間での複数のリレーションシップがサポートされます。 混乱や結果の間違いを避けるために、アクティブなリレーションシップとして一度に指定できるリレーションシップは 1 つだけですが、必要に応じてアクティブなリレーションシップを変更し、データのさまざまな組み合わせを計算で使用することができます。 USERELATIONSHIP 関数 (DAX) を使用して、特定の計算で使用する 1 つまたは複数のリレーションシップを指定できます。

テーブル モデルの数式は、以下の規則に従って設計する必要があります。

  • 複数のテーブルがリレーションシップによって関連付けられている場合、キーとして使用される 2 つの列の値が一致することを確認する必要があります。 ただし、参照整合性は強制されないため、キー列に一致しない値があってもリレーションシップを作成できます。 その場合は、空白または一致しない値のために、数式の結果が影響を受けることがあります。

  • リレーションシップを使用してモデル内のテーブルをリンクする場合は、数式を評価するスコープ (または コンテキストとも呼ばれる) が拡大されます。 新しいテーブルや新しいリレーションシップを追加したため、またはアクティブなリレーションシップを変更したためにコンテキストが変化すると、予測していなかった結果の変更が生じることがあります。 詳細については、この記事の前半の「DAX 数式のコンテキスト」を参照してください。

テーブルと列の操作

テーブル モデルにおけるテーブルは、外観が Excel テーブルと似ていますが、データや数式を処理する方法は異なります。

  • 数式では、テーブルおよび列のみを使用できます。個々のセル、範囲参照、配列などは使用できません。

  • 数式では、リレーションシップを使用して関連するテーブルから値を取得できます。 取得した値は、常に現在の行の値に関連しています。

  • Excel ワークシートとは異なり、不規則データを含めることはできません。 テーブル内の各行には同じ数の列が含まれている必要があります。 ただし、一部の列には空の値を含めることができます。 Excel データ テーブルと、テーブル モデルのデータ テーブルを置き換えることはできません。

  • 各列のデータ型は設定されているので、それぞれの列の値は、その型と同じである必要があります。

数式でのテーブルと列の参照

テーブルと列はその名前を使用して参照できます。 たとえば、次の数式は 完全修飾 名を使用して 2 つのテーブルの列を参照する方法を示しています。

=SUM('New Sales'[Amount]) + SUM('Past Sales'[Amount])  

モデル デザイナーで数式を評価すると、最初に全般的な構文がチェックされます。その後、指定した列およびテーブルの名前がチェックされ、現在のコンテキストに適合しているかどうか照合されます。 名前があいまいな場合や、列またはテーブルが見つからない場合は、数式がエラーになります (エラーが発生したセルでは、データ値の代わりに #ERROR という文字列が表示されます)。 テーブル、列、およびその他のオブジェクトの名前付け要件の詳細については、「 DAX 構文リファレンス」の「名前付け要件」を参照してください。

テーブルのリレーションシップ

テーブル間のリレーションシップを作成すると、別のテーブルのデータを参照して関連する値を使用し、複雑な計算を行うことができます。 たとえば、計算列を使用して、現在の再販業者に関連する出荷レコードをすべて検索してから、それぞれの輸送費を合計することができます。 ただし、多くの場合、リレーションシップは必要ありません。 数式内で LOOKUPVALUE 関数を使用して、 search_column および search_value パラメーターで指定された条件を満たす行の result_columnName の値を返すことができます。

DAX 関数の多くでは、参照先の列を見つけて意味のある結果を返すために、テーブル間のリレーションシップが必要になります。 リレーションシップを特定しようとする関数もありますが、最適な結果を得るには、可能な限りリレーションシップを作成するようにしてください。 詳細については、この記事の前半の「数式と表形式モデル」を参照してください。

数式の結果の更新 (プロセス)

データ処理再計算 は、別個の操作ですが互いに関連しています。 複雑な数式、大量のデータ、または外部データ ソースから取得されるデータを含むモデルをデザインする場合には、これらの概念を十分理解している必要があります。

データ処理 は、外部データ ソースの新しいデータでモデル内のデータを更新する処理です。

再計算 は、数式自体に対する変更と基になるデータの変更を反映するために、数式の結果を更新する処理です。 再計算は、以下のようにパフォーマンスに影響を及ぼす場合があります。

  • 集計列の値が計算され、モデルに格納されます。 計算列の値を更新するには、完全処理、データ処理、または再計算の 3 つの処理コマンドのいずれかを使用してモデルを処理する必要があります。 数式が変更された場合、列全体に対して、常に数式の結果を再計算する必要があります。

  • メジャーによって計算される値は、ユーザーがメジャーをピボットテーブルに追加したときやレポートを開いたときに動的に評価されます。ユーザーがコンテキストを変更すると、メジャーによって返される値は変化します。 メジャーの結果には、常に最新のメモリ内キャッシュが反映されます。

再計算の結果、異なる値が返され、ロール メンバーによる行のクエリの可否が変化しない限り、処理も再計算も行フィルターの数式には影響しません。

数式内のエラーのトラブルシューティング

数式を定義するときにエラーが発生した場合は、その数式に 構文エラーセマンティック エラー、または 計算エラーが含まれている可能性があります。

構文エラーの解決は非常に簡単です。 かっこやコンマが不足している場合がよくあります。 個々の関数の構文については、「 DAX 関数リファレンス」を参照してください。

構文は正しいが、参照される値または列が数式のコンテキストで意味をなさないときには、別のエラーが発生します。 このようなセマンティック エラーや計算エラーは次のような問題が原因で生じている可能性があります。

  • 数式が、存在しない列、テーブル、または関数を参照している。

  • 数式は正しいように見えるが、データ エンジンがデータをフェッチしたときに型の不一致が検出され、エラーが発生する。

  • 数式が関数に渡したパラメーターの数または型が正しくない。

  • 数式が参照している別の列にエラーがあるため、その値が無効になる。

  • 数式が参照している列が処理されなかった。メタデータは含まれるが、計算するための実際のデータが含まれない。

最初の 4 つのケースでは、DAX は無効な数式を含んでいる列全体にフラグを設定します。 最後のケースでは、DAX は列をグレーで表示し、その列が未処理状態であることを示します。

こちらもご覧ください

Data Analysis Expressions (DAX) リファレンス
メジャー
計算列
ロール
KPI
サポートされているデータ ソース