DAX の構文

この記事では、DAX 式表現言語の構文と要件について説明します。

構文の要件

DAX 式は、常に等号 (=) で始まります。 等号の後には、スカラーに評価される任意の式、またはスカラーに変換できる式を指定できます。 デモには次のものが含まれます。

  • スカラー定数、またはスカラー演算子 (+,-,*,/,>=,...,&&, ...) を使用する式

  • 列またはテーブルへの参照。 DAX 言語では、関数への入力として常にテーブルと列が使用されます。配列や任意の値のセットが使用されることはありません。

  • 式の一部として提供される演算子、定数、値。

  • 関数とその必須引数の結果。 一部の DAX 関数では、スカラーではなくテーブルが返され、テーブルを評価してスカラーを返す関数にラップする必要があります。テーブルは、単一列で単一行のテーブルでない限り、スカラー値として扱われます。

    ほとんどの DAX 関数には 1 つ以上の引数が必要であり、テーブル、列、式、値を含めることができます。 ただし、PI などの一部の関数では、引数は必要ありませんが、null 引数を示すかっこが常に必要です。 たとえば、PI ではなく、常に PI() と入力する必要があります。 また、関数を他の関数の中に入れ子にすることもできます。

  • 式。 式には、演算子、定数、または列への参照のいずれかまたはすべてを含めることができます。

たとえば、以下に示すものはすべて有効な式です。

Formula 結果
= 3 3
= "Sales" Sales
= 'Sales'[Amount] Sales テーブル内でこの式を使用すると、Sales テーブルの現在の行の Amount 列の値が取得されます。
= (0.03 *[Amount])

=0.03 * [Amount]
現在のテーブルの Amount 列の値の 3%。

この式を使用してパーセンテージを計算できますが、テーブルに書式設定を適用しない限り、結果はパーセンテージとして示されません。
= PI() 定数 pi の値。

数式の動作は、使用方法によって異なる場合があります。 常に、コンテキストを認識し、式で使われていデータが、計算に使われる可能性のある他のデータとどのように関連しているかを、把握しておく必要があります。

名前付けの要件

データ モデルには、多くの場合、複数のテーブルが含まれます。 テーブルとその列をまとめたもので、インメモリ分析エンジン (VertiPaq) に格納されるデータベースが構成されます。 そのデータベース内では、すべてのテーブルに一意の名前が必要です。 また、列の名前は、各テーブル内で一意である必要があります。 すべてのオブジェクト名は、"大文字と小文字が区別されません"。たとえば、名前 SALESSales は、同じテーブルを表します。

既存のデータ モデルに追加する各列およびメジャーは、特定のテーブルに属している必要があります。 列が含まれるテーブルは、テーブル内に計算列を作成するときに暗黙的に指定するか、メジャーを作成し、メジャーの定義を格納するテーブルの名前を指定するときに、明示的に指定します。

関数への入力としてテーブルまたは列を使用するときは、通常、列名を "修飾する" 必要があります。 列の "完全修飾" 名は、テーブル名の後に、列名を角かっこで囲んで指定します (例: 'U.S.Sales'[Products])。 次のコンテキストで列を参照する場合は、常に完全修飾名が必要です。

  • 関数への引数として、VALUES

  • 関数への引数として、ALL または ALLEXCEPT

  • 関数へのフィルター引数内、CALCULATE または CALCULATETABLE

  • 関数への引数として、RELATEDTABLE

  • 任意のタイム インテリジェンス関数への引数として

"非修飾" 列名は、列の名前を角かっこで囲んだだけのものです (例: [Sales Amount])。 たとえば、現在のテーブルの同じ行からスカラー値を参照するときは、非修飾列名を使用できます。

テーブルの名前にスペース、予約されたキーワード、または使用できない文字が含まれる場合は、テーブル名を単一引用符で囲む必要があります。 また、現在のロケールがその文字セットをサポートしているかどうかに関係なく、ANSI 英数字の範囲外のいずれかの文字が名前に含まれる場合にも、テーブル名を引用符で囲む必要があります。 たとえば、「Таблица」のようなキリル文字で記述されたテーブル名が含まれるブックを開く場合は、テーブル名にスペースが含まれていなくても、テーブル名を引用符で囲む必要があります。

注意

列の完全修飾名の入力を簡単にするには、数式エディターのオートコンプリート機能を使用します。

テーブル

  • 現在のテーブルとは異なるテーブルの列である場合は、テーブル名が常に必要です。 テーブル名は、データベース内で一意である必要があります。

  • テーブル名にスペース、他の特殊文字、または英語以外のアルファベットや数字が含まれている場合は、単一引用符で囲む必要があります。

メジャー

  • メジャー名は常に角かっこで囲む必要があります。

  • メジャー名にはスペースを含めることができます。

  • 各メジャー名は、モデル内で一意でなければなりません。 したがって、既存のメジャーを参照するときは、メジャー名の前のテーブル名は省略できます。 ただし、メジャーを作成するときは、メジャー定義が格納されるテーブルを常に指定する必要があります。

列名は、テーブルのコンテキスト内で一意である必要があります。ただし、同じ名前の列を複数のテーブルで使用できます (あいまいさの解消はテーブル名で行われます)。

解決しなければならない名前の競合が存在する可能性がある場合や、列名を完全に修飾する必要がある特定の関数の場合を除き、一般に、列が属するベース テーブルを参照しなくても、列を参照できます。

予約されているキーワード

テーブルに使用する名前が Analysis Services の予約済みキーワードと同じ場合は、エラーが発生し、テーブルの名前を変更する必要があります。 ただし、オブジェクト名が角かっこで囲まれている場合 (列の場合)、または引用符で囲まれている場合 (テーブルの場合) は、オブジェクト名でキーワードを使用できます。

注意

アプリケーションによっては、引用符を複数の異なる文字で表すことができます。 外部のドキュメントまたは Web ページから式を貼り付ける場合は、開始と終了の引用符に使用されている文字の ASCII コードを調べて、それらが同じであることを確認しててください。 そうでない場合、DAX で記号が引用符として認識されず、参照が無効になることがあります。

特殊文字

次の文字と文字の種類は、テーブル、列、またはメジャーの名前では無効です。

  • 先頭または末尾のスペース。スペースが名前の区切り記号、角かっこ、または単一アポストロフィで囲まれている場合を除きます。

  • 制御文字

  • オブジェクトの名前で無効な次の文字:

    .,;':/\*|?&%$!+=()[]{}<>

オブジェクト名の例

次の表に、オブジェクト名の例をいくつか示します。

オブジェクトの種類 コメント
テーブル名 Sales テーブル名にスペースや他の特殊文字が含まれていない場合、名前を引用符で囲む必要はありません。
テーブル名 'Canada Sales' 名前にスペース、タブ、または他の特殊文字が含まれている場合は、名前を単一引用符で囲みます。
完全修飾列名 Sales[Amount] 列名の前にテーブル名を記述し、列名は角かっこで囲みます。
完全修飾メジャー名 Sales[Profit] メジャー名の前にテーブル名を記述し、メジャー名は角かっこで囲みます。 特定のコンテキストでは、完全修飾名が常に必要です。
非修飾列名 [Amount] 非修飾名は、角かっこで囲んだ列名だけです。 非修飾名を使用できるコンテキストには、同じテーブル内の計算列内の式や、同じテーブルをスキャンする集計関数内の式などがあります。
スペースを含むテーブル内の完全修飾列 'Canada Sales'[Qty] テーブル名にスペースが含まれているため、単一引用符で囲む必要があります。

その他の制限事項

各関数に必要な構文と、実行できる操作の種類は、関数によって大きく異なります。 ただし、一般に、すべての数式と式には次の規則が適用されます。

  • DAX の数式と式では、テーブル内の個々の値を変更または挿入することはできません。

  • DAX を使用して計算行を作成することはできません。 作成できるのは、計算列とメジャーだけです。

  • 計算列を定義するときは、関数を任意のレベルに入れ子にすることができます。

  • DAX には、テーブルを返す関数がいくつかあります。 通常、これらの関数によって返される値を、入力としてテーブルが必要な他の関数への入力として使用します。

DAX の演算子と定数

次の表では、DAX でサポートされる演算子の一覧を示します。 個々の演算子の構文の詳細については、「DAX 演算子」を参照してください。

演算子の種類 シンボルと用途
かっこ演算子 () 優先順位と引数のグループ化
算術演算子 + (加算)

- (減算/

符号)

* (乗算)

/ (除算)

^ (累乗)
比較演算子 = (等しい)

> (より大きい)

< (より小さい)

>= (以上)

<= (以下)

<> (等しくない)
テキスト連結演算子 & (連結)
論理演算子 && (AND)

|| (or)

データ型

DAX 式で使用する列または値のデータ型をキャスト、変換、またはそれ以外で指定する必要はありません。 DAX 式でデータを使用すると、DAX により、参照されている列のデータ型および入力された値のデータ型が自動的に識別され、指定された操作を完了するために必要な場合は変換が暗黙で実行されます。

たとえば、日付の値に数値を加算しようとすると、エンジンにより関数のコンテキストで操作が解釈されて、数値が共通のデータ型に変換された後、目的の形式 (日付) で結果が表されます。

ただし、正常に変換できる値にはいくつかの制限があります。 現在の操作と互換性のないデータ型が値または列にある場合、DAX はエラーを返します。 また、DAX には、データ モデルにインポートされた既存のデータのデータ型を明示的に変更、変換、またはキャストできる関数は用意されていません。

重要

DAX では、バリアント データ型の使用はサポートされていません。 したがって、データ モデルにデータを読み込んだりインポートしたりするときは、各列のデータが一般に一貫性のあるデータ型であることが想定されます。

一部の関数では、文字列を含むスカラー値が返されますが、他の関数では数値、整数と実数の両方、または日付と時刻が処理されます。 各関数に必要なデータ型については、DAX 関数に関するセクションを参照してください。

関数への引数として、データの複数の列および複数の行を含むテーブルを使用できます。 また、一部の関数で返されるテーブルは、メモリに格納されており、他の関数の引数として使用できます。

日付と時刻

DAX では、Microsoft SQL Server によって使用される datetime データ型を使用して日付と時刻の値が格納されます。 datetime 形式では浮動小数点数が使用されます。ここで、Date 値は、1899 年 12 月 30 日以降の日数を表す整数部分に対応します。 Time 値は日付値の小数部分に対応します。ここで、時間、分、秒は 1 日の小数として表されます。 DAX 日付および時刻関数を使うと、引数が datetime データ型に暗黙的に変換されます。

注意

DAX がサポートする DateTime 値の正確な最大値は、12 月 31 日 9999 00:00:00 です。

日付と時刻のリテラル

Power BI Desktop の 2021 年 8 月バージョン以降、DAX の date および datetime 値は、形式 dt"YYYY-MM-DD"dt"YYYY-MM-DDThh:mm:ss"、または dt"YYYY-MM-DD hh:mm:ss" でリテラルとして指定できます。 リテラルとして指定した場合、式で DATETIMEDATEVALUETIMEVALUE 関数を使用する必要はありません。

たとえば、次の式では、OrderDate でのフィルターに DATE および TIME 関数が使用されます。

EVALUATE
FILTER (
        FactInternetSales,
        [OrderDate] > (DATE(2015,1,9) + TIME(2,30,0)) &&[OrderDate] < (DATE(2015,12,31) + TIME(11,59,59))
)

同じフィルター式をリテラルとして指定できます。

EVALUATE
FILTER (
        FactInternetSales,
        [OrderDate] > dt"2015-1-9T02:30:00" && [OrderDate] < dt"2015-12-31T11:59:59"
)

注意

DAX の date および datetime 型のリテラル形式が、Power BI Desktop、Analysis Services、および Excel の Power Pivot のすべてのバージョンでサポートされているわけではありません。 通常、DAX の新機能または更新された機能が最初に Power BI Desktop で導入され、次に Analysis Services および Excel の Power Pivot に含まれるようになります。