DAX の概要

Data Analysis Expressions (DAX) は Analysis Services、Power BI、および Excel の Power Pivot で使用される数式表現言語です。 DAX の数式には、表形式データ モデルの関連テーブルと列のデータで高度な計算やクエリを実行するための関数、演算子、値が含まれます。

この記事では、DAX における最も重要な概念の基本のみを紹介します。 DAX を使用するあらゆる製品に適用される DAX について説明します。 機能によっては、特定の製品や用途に当てはまらないことがあります。 DAX の特定の実装については、お使いの製品のドキュメントを参照してください。

計算

DAX 式は、メジャー、計算列、計算テーブル、および行レベルのセキュリティで使用されます。

メジャー

メジャーは動的な計算式であり、コンテキストに応じて結果が変わります。 メジャーは、Power BI レポート、Excel のピボットテーブルとピボットグラフなど、複数の属性を利用することでモデル データの結合やフィルター処理をサポートするレポートで使用されます。 メジャーは、モデル デザイナーの DAX 数式バーを利用して作成されます。

メジャーの数式では、COUNT や SUM など、オート SUM 機能を利用して自動的に作成される標準の集計関数を使用できます。あるいは、DAX 数式バーを利用して独自の数式を定義できます。 名前付きメジャーは引数として他のメジャーに渡すことができます。

数式バーでメジャーの数式を定義すると、現在のコンテキスト全体に対する結果のプレビューがツールヒント機能を使用して表示されます。ただし、それ以外の結果はすぐには表示されません。 (フィルターされた) 計算結果をすぐに確認できない理由は、コンテキストがない限りメジャーの結果が決定されないためです。 メジャーを評価するには、各セルに関連するデータを取得して、各セルの式を評価するために必要なコンテキストを提供できるレポート クライアント アプリケーションが必要です。 そのクライアントとしては、Excel のピボットテーブルまたはピボットグラフ、Power BI レポート、SQL Server Management Studio (SSMS) の DAX クエリのテーブル式が考えられます。

クライアントに関係なく、結果内の各セルに対して個別のクエリが実行されます。 つまり、ピボットテーブルの行/列ヘッダーの各組み合わせ、あるいは Power BI レポート内のスライサーとフィルターの各選択により、さまざまなデータ サブセットが生成され、それに対してメジャーが計算されます。 たとえば、次のような非常に単純なメジャー数式を使用します。

Total Sales = SUM([Sales Amount])

ユーザーが TotalSales メジャーをレポートに配置してから、Product テーブルの Product Category 列を Filters に配置すると、製品カテゴリ別に Sales Amount の合計が計算され、表示されます。

計算列とは異なり、メジャーの構文には、数式の前に付けられるメジャーの名前を含めます。 先ほどの例では、Total Sales という名前が数式の前に付けられています。 メジャーを作成すると、名前とその定義がレポート クライアント アプリケーションのフィールド一覧に表示されます。パースペクティブとロールによっては、モデルの全ユーザーが利用できます。

詳細については、次を参照してください。
Power BI Desktop のメジャー
Analysis Services のメジャー
PowerPivot のメジャー

計算列

計算列とは、(モデル デザイナーで) 既存のテーブルに追加したら、列の値を定義する DAX 数式を作成する列です。 計算列に有効な DAX 数式が含まれていると、数式が入力された直後に各行に対して値が計算されます。 その後、メモリ内のデータ モデルに値が保存されます。 たとえば、Date テーブルで、数式バーに数式を入力します。

= [Calendar Year] & " Q" & [Calendar Quarter]

(同じ Date テーブルの) Calendar Year 列から値を取得し、スペースと大文字の Q を追加し、(同じ Date テーブルの) Calendar Quarter 列から値を追加することで、テーブルの各行の値が計算されます。 計算列の各行の結果が直後に計算され、2017 Q1 のように表示されます。 列値は、そのテーブルまたは関連テーブルが処理 (更新) されたとき、または、モデルがメモリからアンロードされた後にリロードされたとき (Power BI Desktop ファイルを閉じて再度開くときなど) にのみ再計算されます。

詳細については、以下をご覧ください。
Power BI Desktop の計算列
Analysis Services の計算列
PowerPivot の計算列

計算テーブル

計算テーブルは、計算式に基づいて計算されるオブジェクトで、同じモデル内にある他のテーブルの全部または一部から派生されます。 テーブルの値は、値を問い合わせてデータ ソースから新しいテーブルの列に読み込むのではなく、DAX 式によって定義されます。

計算テーブルは多様ディメンションで役立つことがあります。 たとえば、Date テーブルの場合、外部キーのリレーションシップに基づき、OrderDate、ShipDate、または DueDate となります。 ShipDate の計算テーブルを明示的に作成することで、他のあらゆるテーブルと同様に完全演算可能な、クエリに利用できるスタンドアロン テーブルが得られます。 計算テーブルは、フィルター処理された行セットを構成するときや、他の既存のテーブルから列のサブセットまたはスーパーセットを構成するときにも役立ちます。 特定のシナリオをサポートする目的でテーブルのバリエーションを作成しても、元のテーブルをそのまま維持できます。

計算テーブルでは、他のテーブルとのリレーションシップがサポートされます。 計算テーブルの列にもデータ型や書式設定があり、データ カテゴリに所属させることもできます。 計算テーブルは、他のあらゆるテーブルと同様に、名前を付けたり、表示/非表示を切り替えたりできます。 データの取得元テーブルが更新されると、計算テーブルは再計算されます。

詳細については、以下をご覧ください。
Power BI Desktop の計算テーブル
Analysis Services の計算テーブル

行レベルのセキュリティ

行レベルのセキュリティでは、特定のロールのメンバーによるクエリの結果によって返すことができる行を定義して、DAX 式がブール値の TRUE/FALSE 条件に評価される必要があります。 たとえば、Sales ロールのメンバーについて、Customers テーブルに次の DAX 数式を適用します。

= Customers[Country] = "USA"

Sales ロールのメンバーは、米国の顧客データのみを表示できます。SUM などの集計は米国の顧客に対してのみ返されます。 行レベルのセキュリティは、Excel の Power Pivot では使用できません。

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

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

詳細については、以下をご覧ください。
Power BI での行レベルのセキュリティ (RLS)
Analysis Services のロール

クエリ

DAX クエリは、SQL Server Management Studio (SSMS) と、DAX Studio (daxstudio.org) などのオープンソースのツールで作成し、実行できます。 表形式データ モデルでのみ作成できる DAX 計算式とは異なり、DAX クエリは Analysis Services 多次元モデルに対しても実行できます。 DAX クエリはしばしば、Multidimensional Data Expressions (MDX) クエリより記述しやすく、効率的です。

DAX クエリはステートメントであり、T-SQL の SELECT ステートメントに似ています。 DAX クエリの最も基本的な種類は、evaluate ステートメントです。 たとえば、

EVALUATE
 ( FILTER ( 'DimProduct', [SafetyStockLevel] < 200 ) )
ORDER BY [EnglishProductName] ASC

SafetyStockLevel が 200 に満たない製品のみを EnglishProductName の昇順でリストアップするテーブルを Results に返します。

メジャーはクエリの一部として作成できます。 メジャーはクエリの継続期間のみ存在します。 詳細については、「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 には、日付と時刻を利用した計算、条件付きの値の作成、文字列の使用、リレーションシップに基づく参照の実行に利用できる関数が含まれています。また、あるテーブルに対して繰り返し計算を実行できます。 これらの関数の多くは、Excel の数式と非常によく似ています。ただし、DAX の数式は、次の点が大きく異なります。

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

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

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

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

集計関数

集計関数では、列またはテーブル内のすべての行の数、合計、平均、最小値、最大値などの (スカラー) 値が、式で定義されているように計算されます。 詳細については、「集計関数」を参照してください。

日付と時刻関数

DAX の日付と時刻の関数は、Microsoft Excel の日付と時刻の関数に似ています。 ただし、DAX 関数は、1900 年 3 月 1 日以降の datetime データ型に基づいています。 詳細については、「日付と時刻関数」を参照してください。

フィルター関数

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

財務関数

DAX の財務関数は、正味現在価値や返品率などの財務計算を行う数式で使用します。 これらの関数は、Microsoft Excel で使用する財務関数に似ています。 詳細については、「財務関数」を参照してください。

情報関数

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

論理関数

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

数学関数と三角関数

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

その他の関数

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

リレーションシップ関数

DAX のリレーションシップ関数を使用すると、別の関連テーブルから値を返す、式で使用する特定のリレーションシップを指定する、クロス フィルターの方向を指定することができます。 詳細については、「リレーションシップ関数」を参照してください。

統計関数

統計関数では、標準偏差や順列の数など、統計分布や確率に関連する値が計算されます。 詳細については、「統計関数」を参照してください。

文字列関数

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

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

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

テーブル操作関数

これらの関数では、テーブルを返すか、既存のテーブルを操作します。 たとえば、ADDCOLUMNS を使用して、指定したテーブルに計算列を追加する、SUMMARIZECOLUMNS 関数を使用して、グループのセットに対するサマリー テーブルを返すことができます。 詳細については、「テーブル操作関数」を参照してください。

変数

VAR を使用すると、式の中で変数を作成できます。 VAR は厳密には関数ではありません。式の結果を名前付き変数として格納するためのキーワードです。 その変数は他のメジャー式に引数として渡すことができます。 次に例を示します。

VAR
    TotalQty = SUM ( Sales[Quantity] )

Return

    IF (
        TotalQty > 1000,
        TotalQty * 0.95,
        TotalQty * 1.25
        )

この例では、TotalQty を名前付き変数として他の式に渡すことができます。 変数には、テーブルなど、任意のスカラー データ型を指定できます。 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) が返されます。

Context

"コンテキスト" は、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 つのループの間で値が自動的に提供されるので、複雑な集計を作成することができます。

クエリ コンテキスト

クエリ コンテキスト とは、数式に対して暗黙的に取得されるデータのサブセットを指します。 たとえば、ユーザーがレポートにメジャーやフィールドを配置すると、エンジンにより、行と列のヘッダー、スライサー、レポート フィルターが調べられ、コンテキストが決定されます。 次に、必要なクエリがモデル データに対して実行され、データの正しいサブセットが取得されます。数式で定義した計算が行われ、レポートに値が設定されます。

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

ただし、ユーザーは一般的に同じ結果を何百回も見たいとは思いません。むしろ、特定の年度、特定の国、特定の製品、あるいはそれらの組み合わせを対象とする利益を取得し、総計を出したいと考えます。

レポートで、フィールドをフィルター処理、追加または削除し、スライサーを使用することで、コンテキストを変更します。 変更するたびに、メジャーが評価されるクエリ コンテキストが変わります。 したがって、メジャーで使用される同じ数式は、セルごとに異なる クエリ コンテキスト で評価されます。

フィルター コンテキスト

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

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

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

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

数式内でフィルターを選択的に消去したり、適用したりする方法の例が必要であれば、「ALLEXCEPT」を参照してください。

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

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

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

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

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

オペレーター

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

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

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

テーブルと列の操作

表形式データ モデルのテーブルは Excel テーブルのように見えますが、データや数式の扱いが異なります。

  • 数式では、テーブルおよび列のみを使用できます。個々のセル、範囲参照、配列などは使用できません。
  • 数式では、リレーションシップを使用して関連するテーブルから値を取得できます。 取得した値は、常に現在の行の値に関連しています。
  • Excel ワークシートとは異なり、不規則データを含めることはできません。 テーブル内の各行には同じ数の列が含まれている必要があります。 ただし、一部の列には空の値を含めることができます。 Excel データ テーブルと、テーブル モデルのデータ テーブルを置き換えることはできません。
  • 各列のデータ型は設定されているので、それぞれの列の値は、その型と同じである必要があります。

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

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


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

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

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

テーブル間のリレーションシップを作成することにより、他のテーブルの関連する値を計算に使用できるようになります。 たとえば、計算列を使用し、現在のリセラーに関連付けられているすべての出荷レコードを特定して、それぞれの輸送費を合計できます。 ただし、多くの場合、リレーションシップは必要ありません。 数式内で LOOKUPVALUE 関数を使用することで、search_column 引数と search_value 引数で指定されている条件を満たす行の result_columnName の値を返すことができます。

DAX 関数の多くでは、参照先の列を見つけて意味のある結果を返すために、テーブル間のリレーションシップが必要になります。 リレーションシップを特定しようとする関数もありますが、最適な結果を得るには、可能な限りリレーションシップを作成するようにしてください。 表形式データ モデルでは、テーブル間の複数のリレーションシップがサポートされています。 混乱や間違った結果を回避するために、アクティブなリレーションシップとして指定されるリレーションシップは一度に 1 つだけになりますが、必要に応じてアクティブなリレーションシップを変更し、計算に含まれるデータのさまざまなつながりを検討することができます。 USERELATIONSHIP 関数を使用すれば、特定の計算で使用される 1 つまたは複数のリレーションシップを指定できます。

リレーションシップの使用時、これらの数式設計規則を観察することが重要です。

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

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

処理と更新

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

"処理 (更新)" では、外部データ ソースからの新しいデータによりモデル内のデータが更新されます。

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

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

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

再計算の結果、異なる値が返されることで、ロール メンバーによる行のクエリ実行の可否が変わる場合を除き、処理と再計算は行レベルのセキュリティの数式に影響を与えません。

更新

DAX は常に改善されています。 新しい関数と更新された関数は、次回の利用可能な更新プログラムでリリースされ、これは通常、毎月行われます。 最初にサービスが更新された後、Power BI Desktop、Excel、SQL Server Management Studio (SSMS)、および Visual Studio 向けの Analysis Services Projects 拡張機能 (SSDT) などのインストール型アプリケーションが更新されます。 SQL Server Analysis Services は、次回の累積更新プログラムで更新されます。 新しい関数は最初に発表された後、Power BI Desktop 更新プログラムに合わせて DAX 関数リファレンスに記載されます。

一部の関数は、以前のバージョンの SQL Server Analysis Services と Excel ではサポートされていません。

トラブルシューティング

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

構文エラーの解決は非常に簡単です。 かっこやコンマが不足している場合がよくあります。

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

  • 数式が、存在しない列、テーブル、または関数を参照している。
  • 数式は正しいように見えるが、データ エンジンでデータがフェッチされるとき、型の不一致が見つかり、エラーが表示されます。
  • 数式によって、数や型が正しくない引数が関数に渡されます。
  • 数式が参照している別の列にエラーがあるため、その値が無効になる。
  • 数式が参照している列が処理されなかった。メタデータは含まれるが、計算するための実際のデータが含まれない。

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

アプリとツール

Power BI Desktop

Power BI Desktop

Power BI Desktop は、無料のデータ モデリング/レポート アプリケーションです。 モデル デザイナーには、DAX 計算式を作成するための DAX エディターが含まれています。

Excel の Power Pivot

Power Pivot in Excel

Excel の Power Pivot モデル デザイナーには、DAX 計算式を作成するための DAX エディターが含まれています。

Visual Studio

Visual Studio

Analysis Services プロジェクト拡張機能 (VSIX) を追加した Visual Studio を使用して、Analysis Services モデル プロジェクトを作成します。 このプロジェクト拡張機能と共にインストールされるテーブル モデル デザイナーには、DAX エディターが含まれています。

SQL Server Management Studio

SQL Server Management Studio

SQL Server Management Studio (SSMS) は Analysis Services を使用するために不可欠なツールです。 SSMS には、表形式モデルと多次元モデルの両方にクエリを実行するための DAX クエリ エディターが含まれています。

DAX Studio

DAX Studio icon

DAX Studio は、DAX クエリを作成し、Analysis Services、Power BI Desktop、Excel の Power Pivot のモデルに対して実行するためのオープンソース クライアント ツールです。

Tabular Editor

Tabular Editor icon

Tabular Editor は、テーブル モデル メタデータのすべてのオブジェクトを直感的に階層構造で表示できるオープンソース ツールです。 Tabular Editor には、構文が強調表示される DAX エディターが含まれています。これにより、メジャー、計算列、および計算テーブル式を簡単に編集することができます。

学習用のリソース

DAX について学習するとき、データ モデルの作成に使用するアプリケーションを使用することをお勧めします。 Analysis Services、Power BI Desktop、Excel の Power Pivot にはすべて、DAX を使用してメジャー、計算列、行フィルターを作成するレッスンが含まれる記事やチュートリアルがあります。 次にその他のリソースを示します。

ビデオ

Power BI Desktop で DAX を使用するラーニング パス:

Definitive Guide to DAX (Alberto Ferrari と Marco Russo による共著、Microsoft Press)。 現在第 2 版となっているこの包括的ガイドでは、データ モデリングの初心者から BI プロフェッショナルまでを対象に、基本から革新的なハイパフォーマンス手法まで紹介しています。

The Definitive Guide to DAX book image

コミュニティ

DAX には、常に専門知識を進んで共有しようとする活気のあるコミュニティがあります。 Microsoft Power BI コミュニティには、DAX、DAX コマンドおよびヒントのみの特別なディスカッション フォーラムがあります。