次の方法で共有


テーブル モデルでの DAX について (SSAS テーブル)

Data Analysis Expressions (DAX) は、Microsoft PowerPivot for Microsoft Excel のブックおよび SQL Server 2012 Analysis Services (SSAS) のテーブル モデル プロジェクトでカスタムの計算を作成するための数式言語です。 DAX の数式は、リレーショナル テーブルやリレーショナル列に対して高度な計算を実行するための関数、演算子、値などで構成され、関連する値や関連するテーブルを参照することもできます。

DAX は、PowerPivot ブックとテーブル モデル プロジェクトのどちらでも利用できますが、このトピックでは、特に SQL Server データ ツール (SSDT) で作成したテーブル モデル プロジェクトでの利用を想定して取り上げます。 このトピックを読むには、テーブル モデルについて十分に理解している必要があります。SQL Server データ ツール (SSDT) におけるテーブル モデル プロジェクト作成環境についても、よく理解しておく必要があります。

このトピックのセクション:

  • テーブル モデルにおける DAX

  • 計算列、メジャー、および行フィルターにおける DAX の数式

  • DAX データ型

  • DAX の演算子

  • DAX の数式

  • DAX 関数

  • DAX の数式のコンテキスト

  • 数式とリレーショナル モデル

  • テーブルと列の操作

  • 数式の結果の更新 (処理)

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

  • その他のリソース

テーブル モデルにおける DAX

PowerPivot と SQL Server データ ツール (SSDT) で作成されたテーブル モデル プロジェクトのどちらにおいても、それぞれのデータセットから DAX の数式によって値が計算されるしくみに、機能上の違いはありません。 ただし、ブックおよびモデル作成ツールにおいて DAX の数式がどこで作成されるのか、また、特定のメジャーのコンテキストがどこで評価されるのかという点は異なります。

PowerPivot では、セルフサービス ビジネス インテリジェンス分析を目的としてブックのユーザーが計算式を作成するのが一般的です。 PowerPivot ウィンドウでテーブルに対する計算列が作成され、ピボットテーブルまたは計算領域でメジャーが作成されます。 テーブル モデル プロジェクトとは異なり、PowerPivot ブックには、行をセキュリティ保護するために Boolean 値を返す DAX 式を使用できる、ロールベースのセキュリティ機能が備わっていません。

テーブル モデル プロジェクトでは、計算式は、モデルの作成者が SQL Server データ ツール (SSDT) のモデル デザイナーで作成します。 メジャー グリッドのメジャー プレビュー機能を除き、DAX の数式を使用して計算された計算列の値は、モデル デザイナーのテーブルにすぐに表示されますが、メジャーはユーザーが Power View や Microsoft Excel などのレポート クライアントでフィルターを指定するまで計算されません。

新しいテーブル モデル プロジェクトに対し、"PowerPivot からのインポート" プロジェクト テンプレートを使用して PowerPivot ブックをインポートした場合、新しいテーブル モデルには、計算列に対する DAX の数式が自動的に作成されます。 そのブック内の暗黙的なメジャーと明示的なメジャーに対する DAX の数式は、新しいテーブル モデルには明示的なメジャーとして自動的に作成されます。 PowerPivot ブックにはロールおよびセキュリティ保護行フィルターの機能が最初から存在するわけではありません。そのため、モデル データにロールのメンバーがアクセスできるようにするには、新しいテーブル モデルに少なくとも 1 つのロールを作成する必要があります。 行フィルターにおいて DAX 計算が必要となるのは、テーブル データのセキュリティを行レベルで確保する場合のみです。

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

SQL Server データ ツール (SSDT) で作成されるテーブル モデルでは、計算列、メジャー、および行フィルターで DAX の数式が使用されます。

計算列

計算列は、(モデル デザイナーで) 既存のテーブルに追加する列であり、その列の値は、DAX の数式を作成することによって定義されます。 計算列に対する式は、モデル デザイナーから数式バーを使用して作成します。

注意

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

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

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

メジャー

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

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

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

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

詳細については、「メジャー (SSAS テーブル)」を参照してください。

行フィルター

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

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

DAX の数式を使用して行フィルターを定義する場合、許可済みの行セットを作成していることになります。 これは、他の行へのアクセスを否定するのではなく、単に、許可済みの行セットの一部として、それらは返されないだけです。 他のロールは、DAX の数式によって除外された行へのアクセスを許可できます。 あるユーザーが他のロール メンバーで、そのロールの行フィルターがその特定の行セットのアクセスを許可している場合、そのユーザーはその行のデータを表示することができます。

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

詳細については、「ロール (SSAS テーブル)」を参照してください。

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) の範囲の整数でなければなりません。

小数

64 ビット (8 バイト) の実数 1、2

小数点以下を含む数値。 実数では次のような幅広い値が有効です。

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

ゼロ

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

ただし、有効桁数は小数点以下が 17 桁に制限されます。

ブール値

ブール値

True または False の値。

テキスト

文字列

Unicode 文字データ文字列。 文字列、数字、またはテキスト形式で表現される日付を使用できます。

日付

日付/時刻

許容された日付時刻表現による日付および時刻。

1900 年 3 月 1 日より後のすべての日付が有効です。

通貨

通貨

通貨データ型では、-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の範囲の値 (小数点以下が 4 桁で有効桁数が固定長) が有効です。

N/A

空白

空白は、DAX では SQL の NULL に相当するデータ型です。 空白を作成するには BLANK 関数を使用し、空白かどうかをテストするには論理関数の ISBLANK を使用します。

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

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

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

DAX の演算子

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

  • 比較演算子: 値を比較して論理 TRUE/FALSE 値を返します。

  • 算術演算子: 数値を返す算術計算を実行します。

  • テキスト連結演算子: 2 つ以上のテキスト文字列を結合します。

  • 論理演算子: 複数の式を組み合わせて 1 つの結果を返します。

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

DAX の数式

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

数式の基本

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

DAX の数式には、非常に単純なものもあれば、きわめて複雑なものもあります。 次の表には、計算列で使用できる基本的な単純な数式の例を示しています。

数式

説明

=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] とすることで、現行期間内の経過比率を割り出すことができます。

この数式は次の要素で構成されています。

数式の要素

説明

Days in Current Quarter:=

メジャーの名前。

=

数式は等号 (=) で始まります。

COUNTROWS

COUNTROWS 関数 (DAX)は、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 の数式のコンテキスト (SSAS - テーブル モデル)」を参照してください。

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

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

日付と時刻の関数

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

フィルター関数

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

情報関数

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

論理関数

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

数学関数と三角関数

DAX の数学関数は、Excel の数学関数や三角関数と非常によく似ています。 ただし 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 関数」を参照してください。

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

クエリ コンテキスト

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

注記注意

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

数式を指定する場所によってコンテキストが変わるため、数式の結果も変わる可能性があります。

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

ただし、同じ結果を何百回も表示する必要はなく、特定の年度、特定の国、特定の製品、または、そうした条件の組み合わせについて、該当する利益を計算し、総計を求めるのが普通です。

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

フィルター コンテキスト

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

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

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

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

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

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

数式のコンテキストの決定

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

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

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

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

数式のコンテキストの例

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

  2. FILTER 関数 関数を使用すると、現在のコンテキストに含める行を指定できます。 このトピックの例では、集計を行う別の関数にフィルターを埋め込む方法も示されています。

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

  4. ALLEXCEPT 関数 関数を使用すると、指定した以外のすべてのフィルターを削除できます。 どちらのトピックにも、数式の作成と複雑なコンテキストの理解に役立つ例が含まれています。

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

数式とテーブル モデル

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

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

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

加えて、このリリースの新機能として、USERELATIONSHIP 関数 (DAX) は、特定の計算で使用する 1 つまたは複数のリレーションシップを指定します。

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

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

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

テーブルと列の操作

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

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

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

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

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

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

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

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

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

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

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

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

数式の結果の更新 (処理)

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

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

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

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

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

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

詳細については、「データの処理 (SSAS テーブル)」を参照してください。

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

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

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

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

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

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

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

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

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

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

その他のリソース

テーブル モデリング (Adventure Works チュートリアル)」では、計算列、メジャー、および行フィルターに多数の計算を含んだテーブル モデルの作成手順について説明します。 ほとんどの数式について、それぞれの目的が説明されています。

Analysis Services と PowerPivot のチーム ブログには、SQL Server 2012 Analysis Services (SSAS) と PowerPivot に関する情報やヒント、ニュース、告知などが掲載されます。

DAX Wiki には、マイクロソフト内外の DAX 情報が掲載されています。中には、ビジネス インテリジェンスの第一線で活躍する専門家による DAX に関する豊富なソリューションも紹介されています。

関連項目

概念

メジャー (SSAS テーブル)

計算列 (SSAS テーブル)

ロール (SSAS テーブル)

KPI (SSAS テーブル)

サポートされているデータ ソース (SSAS テーブル)

その他の技術情報

Data Analysis Expressions (DAX) リファレンス