データ分析式 (DAX) は、Excel の Analysis Services、Power BI、Power Pivot で使用される数式の言語です。 DAX 数式には、テーブル データ モデルの関連テーブルと列のデータに対して高度な計算とクエリを実行するための関数、演算子、値が含まれます。
この記事では、 DAXの最も重要な概念の基本的な概要のみを示します。 使用するすべての製品に適用される DAX について説明します。 一部の機能は、特定の製品やユース ケースには適用されない場合があります。 DAXの特定の実装について説明している製品のドキュメントを参照してください。
計算
DAX 式は、メジャー、計算列、計算テーブル、行レベルのセキュリティで使われます。
対策
指標は、コンテキストに応じて結果が変化する動的な計算式です。 メジャーは、Power BI レポートまたは Excel のピボットテーブルやピボットグラフなど、複数の属性を使ってモデル データの結合やフィルター処理をサポートするレポートで使われます。 メジャーは、モデル デザイナーの DAX 数式バーを使って作成します。
メジャー内の数式では、COUNTやSUMなど、Autosum機能を使用して自動的に作成される標準集計関数を利用したり、DAX 数式バーを使用して独自の数式を定義したりできます。 名前付き指標は、他の指標に引数として渡すことができます。
数式バーでメジャーの数式を定義すると、ツールヒント機能で現在のコンテキストにおける合計の予測結果をプレビュー表示しますが、それ以外の場合、結果はすぐには出力されません。 計算の (フィルター処理された) 結果をすぐに表示できないのは、コンテキストがないとメジャーの結果を特定できないためです。 メジャーを評価するには、各セルに関連するデータを取得し、各セルの式を評価するために必要なコンテキストを提供できるレポート クライアント アプリケーションが必要です。 そのクライアントは、SQL Server Management Studio (SSMS) の DAX クエリの Excel ピボットテーブルまたはピボットグラフ、Power BI レポート、またはテーブル式である可能性があります。
クライアントに関係なく、結果内のセルごとに個別のクエリが実行されます。 つまり、ピボットテーブル内の行ヘッダーと列ヘッダーの組み合わせ、または Power BI レポート内のスライサーとフィルターの各選択によって、メジャーが計算されるデータの異なるサブセットが生成されます。 たとえば、この非常に単純な測定式を使用してみましょう。
Total Sales = SUM([Sales Amount])
ユーザーがレポートに TotalSales メジャーを配置し、製品テーブルの [製品カテゴリ] 列を [フィルター] に配置すると、売上金額の合計が計算され、各製品カテゴリに対して表示されます。
計算列とは異なり、メジャーの構文には、数式の前にメジャーの名前を含めます。 指定した例では、数式の前に Total Sales という名前が表示されます。 メジャーを作成すると、名前とその定義がレポート クライアント アプリケーションの [フィールド] リストに表示され、パースペクティブとロールに応じて、モデルのすべてのユーザーが使用できるようになります。
詳しくは、Power BI Desktop でのメジャー、Analysis Services でのメジャー、Power Pivot でのメジャーに関する記事をご覧ください
計算列
計算列とは、(モデル デザイナーで) 既存のテーブルに追加し、列の値を定義する DAX 数式を作成する列です。 計算列に有効な DAX 数式が含まれている場合、数式が入力されるとすぐに各行の値が計算されます。 その後、値はメモリ内データ モデルに格納されます。 たとえば、Date テーブルでは、数式が数式バーに入力されると、次のようになります。
= [Calendar Year] & " Q" & [Calendar Quarter]
テーブル内の各行の値は、[カレンダー年] 列 (同じ Date テーブル内) から値を取得し、スペースと大文字 Q を追加した後、Calendar Quarter 列 (同じ Date テーブル内) の値を追加することによって計算されます。 計算列の各行の結果はすぐに計算され、 たとえば 2017 年第 1 四半期のように表示されます。 列の値は、Power BI Desktop ファイルを閉じて再度開くときのように、テーブルまたは関連するテーブルが処理 (更新) されるか、モデルがメモリからアンロードされた後に再読み込みされた場合にのみ再計算されます。
詳しくは、Power BI Desktop での計算列、Analysis Services での計算列、Power Pivot での計算列に関する記事をご覧ください。
計算テーブル
計算テーブルは、数式に基づく計算オブジェクトであり、同じモデル内の他のテーブルのすべてまたは一部から派生します。 データ ソースから新しいテーブルの列に値をクエリして読み込む代わりに、 DAX 数式でテーブルの値を定義します。
計算テーブルは、ロールプレイング ディメンションで役立ちます。 たとえば、外部キーのリレーションシップに応じて、OrderDate、ShipDate、DueDate などの Date テーブルがあります。 ShipDate の計算テーブルを明示的に作成すると、クエリで使用できるスタンドアロン テーブルが他のテーブルと同様に完全に操作可能になります。 計算テーブルは、フィルター処理された行セット、または他の既存のテーブルの列のサブセットまたはスーパーセットを構成する場合にも役立ちます。 これにより、特定のシナリオをサポートするために、そのテーブルのバリエーションを作成しながら元のテーブルをそのまま維持できます。
計算テーブルは、他のテーブルとのリレーションシップをサポートします。 計算テーブルの列にはデータ型、書式設定があり、データ カテゴリに属することができます。 計算テーブルには、他のテーブルと同様に名前を付け、表示または非表示にすることができます。 計算テーブルは、データを取得するテーブルのいずれかが更新された場合に再計算されます。
詳細については、「Analysis Services の Power BI Desktop 計算テーブルの計算テーブル」を参照してください。
行レベルのセキュリティ
行レベルのセキュリティでは、 DAX 式はブール TRUE
/FALSE
条件に評価され、特定のロールのメンバーがクエリの結果によって返すことができる行を定義する必要があります。 たとえば、Sales ロールのメンバーの場合、次の DAX 式を持つ Customers テーブルです。
= 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 クエリは、多次元データ式 (MDX) クエリよりも書き込みが簡単で効率的であることがよくあります。
DAX クエリは、T-SQL の SELECT ステートメントに似たステートメントです。 DAXクエリの最も基本的な種類は、evaluate ステートメントです。 たとえば、
EVALUATE
( FILTER ( 'DimProduct', [SafetyStockLevel] < 200 ) )
ORDER BY [EnglishProductName] ASC
SafetyStockLevel が 200 未満の製品のみを EnglishProductName の昇順で一覧表示するテーブルを結果で返します。
メジャーはクエリの一部として作成できます。 対策はクエリの期間中のみ存在します。 詳細については、 DAX クエリに関するページを参照してください。
数式
DAX 式は、計算列とメジャーでの計算の作成、および行レベル セキュリティを使ったデータのセキュリティ保護に不可欠です。 計算列とメジャーの式を作成するには、モデル デザイナー ウィンドウの上部にある数式バーまたは DAX エディターを使います。 行レベルのセキュリティの数式を作成するには、[ロール マネージャー] または [ロールの管理] ダイアログ ボックスを使用します。 このセクションの情報は、 DAX 数式の基本を理解するためのものです。
数式の基本
DAX 数式は、非常に単純または非常に複雑な場合があります。 次の表に、計算列で使用できる単純な数式の例をいくつか示します。
数式 | 定義 |
---|---|
= TODAY() |
計算列のすべての行に今日の日付を挿入します。 |
= 3 |
計算列のすべての行に値 3 を挿入します。 |
= [Column1] + [Column2] |
[Column1] と [Column2] の同じ行に値を追加し、結果を同じ行の計算列に配置します。 |
作成する数式が単純でも複雑でも、数式を作成するときに次の手順を使用できます。
各数式は等号 (=) で始まる必要があります。
関数名を入力または選択するか、式を入力できます。
目的の関数または名前の最初の数文字を入力し始めると、オートコンプリートに使用可能な関数、テーブル、列の一覧が表示されます。 Tab キーを押して、オートコンプリート リストから数式に項目を追加します。
Fx ボタンを クリックして、使用可能な関数の一覧を表示することもできます。 ドロップダウン リストから関数を選択するには、方向キーを使用して項目を強調表示し、[ OK] をクリックして関数を数式に追加します。
可能なテーブルと列のドロップダウン リストから引数を選択するか、値を入力して、関数に引数を指定します。
構文エラーを確認します。すべてのかっこが閉じられ、列、テーブル、値が正しく参照されていることを確認します。
Enter キーを押して数式を受け入れます。
注
計算列では、数式を入力して数式が検証されるとすぐに、列に値が入力されます。 メジャーで Enter キーを押すと、メジャー定義がテーブルと共に保存されます。 数式が無効な場合は、エラーが表示されます。
この例では、Days in Current Quarter という名前のメジャーに含まれる数式を見てみましょう。
Days in Current Quarter = COUNTROWS( DATESBETWEEN( 'Date'[Date], STARTOFQUARTER( LASTDATE('Date'[Date])), ENDOFQUARTER('Date'[Date])))
このメジャーは、未完了の期間と前の期間との比較比率を作成するために使用されます。 数式では、経過した期間の割合を考慮し、前の期間の同じ比率と比較する必要があります。 この場合、[現在の四半期から日付までの日数]/[現在の四半期の日数] は、現在の期間に経過した割合を示します。
この数式には、次の要素が含まれています。
式の要素 | 説明 |
---|---|
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 列を指定します。 |
数式オートコンプリートの使用
AutoComplete は、数式内の各要素のオプションを提供することで、有効な数式構文を入力するのに役立ちます。
既存の数式の途中で、入れ子になった関数を含む数式オートコンプリートを使用できます。 挿入ポイントの直前のテキストを使用してドロップダウン リストに値を表示し、挿入ポイントの後のすべてのテキストは変更されません。
オートコンプリートでは、関数の終わりかっこが追加されたり、かっこが自動的に一致したりすることはありません。 各関数が構文的に正しいか、数式を保存または使用できないことを確認する必要があります。
数式で複数の関数を使用する
関数は入れ子にすることができます。つまり、一方の関数の結果を他方の関数の引数として使用することができます。 計算列では、最大 64 レベルまで関数を入れ子にできます。 ただし、入れ子にすると、数式の作成やトラブルシューティングが困難になる場合があります。 多くの関数は、入れ子になった関数としてのみ使用されるように設計されています。 これらの関数はテーブルを返しますが、結果として直接保存することはできません。テーブル関数への入力として指定する必要があります。 たとえば、関数 SUMX、 AVERAGEX、 MINX はすべて、最初の引数としてテーブルを必要とします。
機能
関数は、式内の名前付き数式です。 ほとんどの関数には、必須引数と省略可能な引数 (パラメーターとも呼ばれます) が入力として含まれています。 関数が実行されると、値が返されます。 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 のデータ型 | 説明 |
---|---|---|
Whole Number |
64 ビット (8 バイト) の整数値 1、2 | 小数点以下の桁数を持たない数値。 整数は正または負の数にすることができますが、-9,223,372,036,854,775,808 (-2^63) ~ 9,223,372,036,854,775,807 (2^63-1) の整数である必要があります。 |
Decimal Number |
64 ビット (8 バイト) 実数 1、2 | 実数とは、小数点を含むことができる数値のことです。 実数は、さまざまな値をカバーします。 -1.79E +308 ~ -2.23E -308 の負の値 ゼロ 2.23E -308 ~ 1.79E + 308 の正の値 ただし、有効桁数は 17 桁の 10 進数に制限されます。 |
Boolean |
ボーリアン | True または False のいずれかの値。 |
Text |
糸 | Unicode 文字データ文字列。 文字列、数値、またはテキスト形式で表される日付を指定できます。 |
Date |
日付/時刻 | 受け入れられた日時表現の日付と時刻。 有効な日付は、1900 年 3 月 1 日以降のすべての日付です。 |
Currency |
通貨 | 通貨データ型では、-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の範囲の値を使用できます。固定精度の 4 桁の 10 進数を使用できます。 |
Variant |
変種 | 異なるデータ型を返す可能性がある、DAX メジャーなどの式に使用されます。 たとえば、整数または文字列のいずれかを返す DAX メジャーはバリアント型になります。 |
N/A |
空白 | 空白は、SQL null を表し、置き換える DAX のデータ型です。 BLANK関数を使用して空白を作成し、論理関数ISBLANKを使用して空白をテストできます。 |
表形式データ モデルには、多くの関数への入力または出力として DAX データ型も含まれます。 たとえば、 FILTER 関数はテーブルを入力として受け取り、フィルター条件を満たす行のみを含む別のテーブルを出力します。 テーブル関数と集計関数を組み合わせることで、動的に定義されたデータ セットに対して複雑な計算を実行できます。
通常、データ型は自動的に設定されますが、データ型と、データ型が DAX 式にどのように適用されるかを理解することが重要です。 数式のエラーや予期しない結果は、多くの場合、引数で指定されたデータ型では使用できない特定の演算子を使用することによって発生します。 たとえば、数式 = 1 & 2
は、12 の文字列結果を返します。 ただし、 = "1" + "2"
数式は 3 の整数の結果を返します。
注
文字列データ型の計算は、64 kb に制限される場合があります。
コンテキスト
コンテキスト は、 DAX 数式を作成するときに理解しておく必要がある重要な概念です。 コンテキストは、数式の結果が現在の行またはセルの選択と関連データを反映するように変更されるため、動的分析を実行できます。 コンテキストを理解し、コンテキストを効果的に使用することは、高性能で動的な分析を構築したり、数式の問題のトラブルシューティングを行うために重要です。
表形式モデルの数式は、他の設計要素に応じて、異なるコンテキストで評価できます。
- ピボットテーブルまたはレポートに適用されるフィルター
- 数式内で定義されたフィルター
- 数式内で特殊な関数を使用して指定されたリレーションシップ
コンテキストには、 行コンテキスト、 クエリ コンテキスト、 フィルター コンテキストというさまざまな種類があります。
行コンテキスト
行コンテキスト は、"現在の行" と考えることができます。 計算列に数式を作成する場合、その数式の行コンテキストには、現在の行のすべての列の値が含まれます。 テーブルが別のテーブルに関連付けられている場合、コンテンツには、現在の行に関連する他のテーブルのすべての値も含まれます。
たとえば、同じテーブルの 2 つの列 (Freight と Tax) から値を加算する計算列 ( = [Freight] + [Tax]
) を作成するとします。 この数式は、指定した列の現在の行からの値のみを自動的に取得します。
また、行コンテキストは、 DAX 数式を使用して計算列内で定義されたリレーションシップを含め、テーブル間で定義されたリレーションシップに従って、関連テーブル内のどの行が現在の行に関連付けられているかを判断します。
たとえば、次の数式では、 RELATED 関数を使用して、注文が出荷されたリージョンに基づいて、関連するテーブルから税の値をフェッチします。 税額は、現在のテーブルのリージョンの値を使用して、関連テーブル内のリージョンを検索し、関連テーブルからそのリージョンの税率を取得することによって決定されます。
= [Freight] + RELATED('Region'[TaxRate])
この数式は、[地域] テーブルから現在の地域の税率を取得し、[輸送] 列の値に追加します。 DAX数式では、テーブルを接続する特定のリレーションシップを知ったり指定したりする必要はありません。
複数行コンテキスト
DAX には、テーブルに対して計算を反復処理する関数が含まれています。 これらの関数は、複数の現在の行を持つ場合があり、それぞれに独自の行コンテキストがあります。 基本的に、これらの関数を使用すると、内部ループと外側ループに対して再帰的に操作を実行する数式を作成できます。
たとえば、モデルに Products テーブルと Sales テーブルが含まれているとします。 ユーザーは、複数の製品を含むトランザクションでいっぱいの売上テーブル全体を調べ、1 つのトランザクションで各製品に対して注文された最大数量を見つける必要がある場合があります。
DAXを使用すると、正しい値を返す 1 つの数式を作成でき、ユーザーがテーブルにデータを追加するたびに結果が自動的に更新されます。
= MAXX(FILTER(Sales,[ProdKey] = EARLIER([ProdKey])),Sales[OrderQty])
この数式の詳細な例については、 EARLIERを参照してください。
要約すると、 EARLIER 関数は、現在の操作の前にある操作の行コンテキストを格納します。 常に、関数はメモリに 2 セットのコンテキストを格納します。1 つのコンテキスト セットは数式の内部ループの現在の行を表し、もう 1 つのコンテキストセットは数式の外側のループの現在の行を表します。 DAX では、複雑な集計を作成できるように、2 つのループ間の値が自動的にフィードされます。
クエリ コンテキスト
クエリ コンテキスト は、数式に対して暗黙的に取得されるデータのサブセットを指します。 たとえば、ユーザーがメジャーまたはフィールドをレポートに配置すると、エンジンは行ヘッダー、列ヘッダー、スライサー、レポート フィルターを調べてコンテキストを決定します。 次に、モデル データに対して必要なクエリを実行して、データの正しいサブセットを取得し、数式で定義された計算を行い、レポートに値を入力します。
数式を配置する場所によってコンテキストが変わるため、数式の結果も変更される可能性があります。 たとえば、Sales テーブルの Profit 列の値を合計する数式を作成するとします: = SUM('Sales'[Profit])
。 Sales テーブル内の計算列でこの数式を使用する場合、数式のクエリ コンテキストは常に Sales テーブルのデータ セット全体であるため、数式の結果はテーブル全体で同じになります。 結果は、全地域、全製品、全年度などを対象とする利益になります。
ただし、通常、ユーザーは何百回も同じ結果を見たくありませんが、代わりに、特定の年、特定の国、特定の製品、またはこれらの組み合わせの利益を得て、総計を取得したいと考えています。
レポートでは、フィルター処理、フィールドの追加または削除、スライサーの使用によってコンテキストが変更されます。 変更するたびに、メジャーが評価されるクエリ コンテキストが変わります。 したがって、メジャーで使用される同じ数式は、セルごとに異なる クエリ コンテキスト で評価されます。
フィルター コンテキスト
フィルター コンテキスト は、各列または関連テーブルから取得された値で許可される値のセットです。 フィルターは、Desktop またはプレゼンテーション レイヤー (レポートとピボットテーブル) の列に適用できます。 フィルターは、数式内のフィルター式によって明示的に定義することもできます。
フィルター コンテキストは、数式の引数を使用して、列またはテーブルで許可される値のセットにフィルター制約を指定すると追加されます。 フィルター コンテキストは、行コンテキストやクエリ コンテキストなど、他のコンテキストの上に適用されます。
表形式モデルでは、フィルター コンテキストを作成する方法は多数あります。 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 プロジェクト拡張機能 (SSDT) などのインストール済みアプリケーションが更新されます。 SQL Server Analysis Services は、次の累積的な更新プログラムで更新されます。 新しい関数は、最初に発表され、Power BI Desktop の更新と一致する DAX 関数リファレンスで説明されています。
以前のバージョンの SQL Server Analysis Services と Excel では、すべての関数がサポートされているわけではありません。
トラブルシューティング
数式を定義するときにエラーが発生した場合、数式に 構文エラー、 セマンティック エラー、または 計算エラーが含まれている可能性があります。
構文エラーは最も簡単に解決できます。 通常、かっこかコンマが抜けています。
他の種類のエラーは、構文が正しい場合に発生しますが、参照される値または列は、数式のコンテキストでは意味がありません。 このようなセマンティック エラーと計算エラーは、次のいずれかの問題によって発生する可能性があります。
- 数式は、既存ではない列、テーブル、または関数を参照します。
- 数式は正しいように見えますが、データ エンジンがデータをフェッチすると、型の不一致が検出され、エラーが発生します。
- 数式は、正しくない数または型の引数を関数に渡します。
- 数式は、エラーのある別の列を参照するため、その値は無効です。
- 数式は、処理されていない列を参照します。つまり、メタデータは含まれていますが、計算に使用する実際のデータはありません。
最初の 4 つのケースでは、 DAX は無効な数式を含む列全体にフラグを設定します。 最後のケースでは、 DAX は列を淡色表示して、列が未処理の状態であることを示します。
アプリとツール
Power BI Desktop (パワー BI デスクトップ)
Power BI Desktop は、無料のデータ モデリングおよびレポート アプリケーションです。 モデル デザイナーには、DAX計算式を作成するためのDAX エディターが含まれています。
Excel の Power Pivot
Excel の Power Pivot モデル デザイナーには、DAX計算式を作成するためのDAX エディターが含まれています。
Visual Studio
Visual Studio と Analysis Services プロジェクト 拡張機能 (VSIX) は、Analysis Services モデル プロジェクトの作成に使用されます。 プロジェクト拡張機能と共にインストールされた表形式モデル デザイナーには、 DAX エディターが含まれています。
SQL Server Management Studio
SQL Server Management Studio (SSMS) は、Analysis Services を操作するための不可欠なツールです。 SSMS には、表形式モデルと多次元モデルの両方に対してクエリを実行するための DAX クエリ エディターが含まれています。
DAX Studio
DAX Studio は、Excel モデルの Analysis Services、Power BI Desktop、Power Pivot に対して DAX クエリを作成して実行するためのオープンソース クライアント ツールです。
表形式エディター
表形式エディター は、表形式モデルメタデータ内のすべてのオブジェクトの直感的な階層ビューを提供するオープンソース ツールです。 表形式エディターには、構文が強調表示された DAX エディターが含まれており、メジャー、計算列、計算テーブル式を簡単に編集できます。
学習リソース
DAX学習するときは、使用するアプリケーションを使用してデータ モデルを作成することをお勧めします。 Excel の Analysis Services、Power BI Desktop、Power Pivot には、すべて、 DAXを使用したメジャー、計算列、行フィルターの作成に関するレッスンを含む記事とチュートリアルがあります。 その他のリソースを次に示します。
Power BI Desktop ラーニング パスで DAX を使用 します。
アルベルト・フェラーリとマルコ・ルッソによるDAXの決定版ガイド (Microsoft Press)。 第 2 版では、この広範なガイドで、データ モデリングと BI の専門家を開始するための革新的な高パフォーマンス手法の基礎を提供します。
コミュニティ
DAX は、常に専門知識を共有する活気に満ちたコミュニティを持っています。 Microsoft Power BI Community には、 DAX、 DAX コマンド、およびヒントに関する特別なディスカッション フォーラムがあります。