次の方法で共有


DAX の構文

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

構文の要件

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

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

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

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

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

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

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

たとえば、次に示す数式はすべて有効です。

結果
= 3 3
= "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 シンボルを引用符として認識できず、参照が無効になる可能性があります。

特殊文字

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

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

  • 制御文字

  • オブジェクトの名前に無効な文字を次に示します。

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

オブジェクト名の例

次の表は、一部のオブジェクト名の例を示しています。

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

その他の制限事項

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

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

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

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

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

DAX 演算子と定数

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

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

- (減算)

* (乗算)

/ (除算)

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

> (より大きい)

< (より小さい)

>= (以上または等しい)

<= (より小か等しい)

<> (等しくない)
テキスト連結演算子 & (連結)
ロジック演算子 && (AND)

|| (または)

データ型

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

たとえば、日付値に数値を追加しようとすると、エンジンは関数のコンテキストで操作を解釈し、数値を共通のデータ型に変換し、結果を意図した形式の日付で表示します。

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

重要

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

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

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

日付と時刻

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

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

日付と時刻のリテラル

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

たとえば、次の式では、 DATE 関数と TIME 関数を使用して OrderDate でフィルター処理します。

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日付と datetime 型のリテラル形式は、Excel の Power BI Desktop、Analysis Services、Power Pivot のすべてのバージョンではサポートされていません。 新機能と更新された DAX 機能は、通常、最初に Power BI Desktop で導入され、その後、Excel の Analysis Services と Power Pivot に含まれます。