PowerPivot の DAX 構文の仕様
Data Analysis Expressions (DAX) は、PowerPivot for Excel で数式および式を作成する際に部品として使用できる関数、演算子、および定数のライブラリです。 このセクションでは、DAX 言語の構文および要件について詳しく説明します。
作成できる数式の種類の例、および、式を使ってテーブルをフィルター処理したりコンテキストを変更したりする方法については、「Getting Started with Data Analysis Expressions (DAX)」を参照してください。 このトピックの内容は次のとおりです。
構文要件
名前付けに関する要件
関数
演算子および定数
データ型
構文要件
DAX の数式は、Excel テーブルで入力する数式にたいへんよく似ていますが、いくつかの大きな違いがあります。
Microsoft Excel では個々のセルまたは配列を参照できますが、PowerPivot で参照できるのは完全なテーブルまたはデータ列のみです。 ただし、列の一部のみまたは列の一意な値を操作する必要がある場合、列をフィルター処理したり、一意な値を返す DAX 関数を使用して、同じような動作を実現できます。
DAX の数式は、Microsoft Excel とまったく同じデータ型はサポートしません。 通常、DAX で提供されるデータ型は Excel よりも多く、インポート時に一部のデータで暗黙の型変換が実行されます。 詳細については、「Data Types in DAX」を参照してください。
DAX の数式は常に等号 (=) で始まります。 等号の後には、スカラーに評価される式またはスカラーに変換可能な式を指定できます。 その一部を次に示します。
スカラー定数、またはスカラー演算子 (+、-、*、/、>=、...、&&、...) を使用するスカラー式
列またはテーブルへの参照。 DAX 言語では、関数の入力として常にテーブルと列が使用されます。不特定の値のセットや配列は使用できません。
式の一部として指定された演算子、定数、および値。
関数および必須の引数の結果。 スカラーではなくテーブルを返す一部の DAX 関数は、テーブルを評価してスカラーを返す関数にラップされる必要があります。テーブルが単一列、単一行のテーブルでない限り、スカラー値として処理されます。
ほとんどの PowerPivot 関数には、必須の引数 (テーブル、列、式、数値など) が少なくとも 1 つ存在します。PI のように引数をまったく必要としない関数も一部に存在しますが、引数 null を示すためのかっこは必ず指定する必要があります。 たとえば、「PI」ではなく、必ず「PI()」と指定します。 関数の中で他の関数を入れ子にすることもできます。
式。 式には、演算子、定数、列の参照のいずれかまたはすべてを含めることができます。
たとえば、次の数式はいずれも有効です。
数式 |
結果 |
---|---|
=3 |
3 |
="Sales" |
Sales |
='Sales'[Amount] |
Sales テーブル内でこの数式を使用する場合は、現在の行について Sales テーブルの列 Amount の値が取得されます。 |
=(0.03 *[Amount]) =0.03 * [Amount] |
現在のテーブルの Amount 列に格納されている値の 3%。 この数式を使ってパーセンテージを計算することができますが、結果をパーセンテージで表示するには、テーブルで書式設定を適用する必要があります。 |
=PI() |
定数 (円周率) の値。 |
注意
数式の動作は、数式が計算列で使用されるか、ピボットテーブル内のメジャーで使用されるかどうかによって異なります。ユーザーは、コンテキストと、数式で使用するデータが計算で使用される他のデータにどのように関連付けられているかについて、常に注意する必要があります。詳細については、「Context in DAX Formulas」を参照してください。
名前付けに関する要件
PowerPivot ウィンドウには、複数のテーブルを追加し、それぞれ別々のタブに表示することができます。 テーブルと列は、PowerPivot の xVelocity インメモリ分析エンジン (VertiPaq) に格納されているデータベースから構成されます。 このデータベースに存在するすべてのテーブルには一意の名前が必要です。 列の名前も、テーブル単位で一意になっている必要があります。いずれのオブジェクト名でも大文字と小文字は区別されません。たとえば、テーブル名の SALES と Sales は、どちらも同じテーブルを表します。
既存の PowerPivot データベースに追加するそれぞれの列とメジャーは、特定のテーブルに属している必要があります。 列が所属しているテーブルは、暗黙的 (テーブル内で計算列を作成するとき) に指定するか、明示的 (メジャーの作成時、その定義を格納するテーブルの名前を指定するとき) に指定します。
通常、テーブルや列を関数への入力として使用する場合、列名を修飾する必要があります。 テーブル名に続けて角かっこで囲んで指定された列名を列の "完全修飾" 名といいます (例: 'U.S. Sales'[Products])。 以下のコンテキストで列を参照するときは、常に完全修飾名が必要になります。
VALUES 関数の引数として使用する場合
ALL 関数または ALLEXCEPT 関数の引数として使用する場合
CALCULATE 関数または CALCULATETABLE 関数のフィルター引数で使用する場合
RELATEDTABLE 関数の引数として使用する場合
任意のタイム インテリジェンス関数の引数として使用する場合
列の名前だけが角かっこで囲まれたものを "非修飾" の列名といいます (例: [Sales Amount])。 たとえば、現在のテーブルの同じ行のスカラー値を参照する場合、非修飾の列名を使用できます。
テーブルの名前に空白や予約されたキーワード、または無効な文字が含まれる場合、テーブル名を単一引用符で囲む必要があります。 使用しているロケールで文字セットがサポートされているかどうかに関係なく、名前に ANSI 英数文字の範囲にない文字が含まれている場合も、テーブル名を引用符で囲む必要があります。 たとえば、'Таблица' のようにキリル文字で作成されたテーブル名が含まれているブックを開く場合、テーブル名にスペースが含まれていなくても、引用符で囲む必要があります。
注意
列の完全修飾名を簡単に入力できるように、クライアントの数式オートコンプリート機能の使用をお勧めします。
テーブル
列が現在のテーブルとは異なるテーブルに属している場合、テーブル名は省略できません。 テーブル名は、データベース内で一意であることが必要です。
空白、特殊文字、または英語以外のアルファベットと数字を含んだテーブル名は、単一引用符で囲む必要があります。
メジャー
メジャー名は常に角かっこで囲みます。
メジャー名には空白を含めることができます。
それぞれのメジャー名はデータベース内で一意である必要があります。 したがって、既存のメジャーを参照する場合、メジャー名の前に付けるテーブル名は省略可能です。 ただし、メジャーを作成する場合は、そのメジャー定義が格納されるテーブルを必ず指定する必要があります。
列
列名は、1 つのテーブルのコンテキスト内で一意であることが必要です。ただし、複数のテーブルに同じ名前の列を含めることはできます (列名が同じであっても、テーブル名で明確に識別できます)。
通常、列が属するベース テーブルを参照しなくても、その列は参照できます。ただし、解決する必要がある名前の競合が存在する場合や、列名を完全修飾名にする必要がある特定の機能を使用する場合は例外です。
予約済みキーワード
Analysis Services の予約済みキーワードと同じ名前がテーブル名に使用されていると、エラーが発生するため、テーブル名の変更が必要になります。 ただし、角かっこ (列の場合) または引用符 (テーブルの場合) でオブジェクト名を囲めば、キーワードを使用することができます。
注意
引用符を表す文字は、アプリケーションによって異なる可能性があります。外部のドキュメントまたは Web ページから式を貼り付ける場合、開始引用符と終了引用符に使用される文字の ASCII コードが同じであることを必ず確認してください。同じコードでない場合、DAX は記号を引用符として認識できない可能性があり、参照が無効になります。
特殊文字
次の文字および文字種は、テーブル、列、またはメジャーの名前として無効です。
先頭または末尾のスペース (スペースが区切り記号、角かっこ、単一引用符で囲まれていない場合)。
制御文字。
PowerPivot オブジェクトの名前として無効な文字。これらの文字を次に示します。
.,;':/\*|?&%$!+=()[]{}<>
オブジェクト名の例
次の表に、いくつかのオブジェクト名の例を示します。
オブジェクトの種類 |
例 |
解説 |
テーブル名 |
Sales |
空白や特殊文字が含まれていないテーブル名は、引用符で囲む必要はありません。 |
テーブル名 |
'Canada Sales' |
空白、タブ、または特殊文字が含まれている名前は、単一引用符で囲む必要があります。 |
完全修飾列名 |
Sales[Amount] |
テーブル名が列名の前にある場合は、列名を角かっこで囲む必要があります。 |
完全修飾メジャー名 |
Sales[Profit] |
テーブル名がメジャー名の前にある場合は、メジャー名を角かっこで囲む必要があります。 特定のコンテキストでは、常に完全修飾名が必要になります。 |
非修飾列名 |
[Amount] |
非修飾名は単純な列名で、角かっこで囲まれています。 非修飾名を使用できるコンテキストでは、同じテーブル内の計算列、または同じテーブルに対してスキャンを行っている集計関数に数式が含まれています。 |
完全修飾列 (テーブル名に空白を使用) |
‘Canada Sales’[Qty] |
テーブル名にスペースが含まれるので、単一引用符で囲む必要があります。 |
注意
列の完全修飾名を簡単に入力できるように、数式の作成時にオートコンプリート機能の使用をお勧めします。詳細については、「Building Formulas for Calculated Columns and Measures」を参照してください。
各種の制限
各関数に必要な構文と、実行できる操作の種類は、関数によって大きく異なります。 ただし、一般に、次のルールに関しては、すべての数式および式に当てはまります。
テーブル内の個々の値を DAX の数式および式で変更したり挿入したりすることはできません。
DAX を使用して計算行を作成することはできません。 作成できるのは計算列とメジャーだけです。
計算列を定義する際は、関数を入れ子にすることができ、その深さに制限はありません。
DAX には、テーブルを返す関数がいくつかあります。 通常、これらの関数から返された値は、他の (テーブルを入力として使用する) 関数の入力として使用します。
DAX の関数
DAX には、次の種類の関数が用意されています。
DAX の演算子と定数
次の表は、DAX でサポートされる演算子の一覧です。 一般に、DAX の演算子は、Microsoft Excel の場合と同じように動作します (一部の小さな例外を除く)。 各演算子の構文の詳細については、「PowerPivot の DAX 演算子リファレンス」を参照してください。
演算子の種類 |
記号と用途 |
---|---|
かっこ演算子 |
() 引数の優先順位やグループを示すために用いられます |
算術演算子 |
+ (加算) - (減算/ 符号) * (乗算) / (除算) ^ (累乗) |
比較演算子 |
= (等しい) > (より大きい) < (より小さい) >= (以上) <= (以下) <> (等しくない) |
テキスト連結演算子 |
& (連結) |
論理演算子 |
&& (論理積) || (論理和) |
DAX におけるデータ型
DAX の数式で使用する列または値に関して、データ型のキャスト、変換、または指定を行う必要はありません。 DAX の数式に何かデータを使用すると、参照された列 (または入力された値) のデータ型が DAX によって自動的に判別され、指定された演算を実行するうえで必要であれば暗黙的な変換が実行されます。
たとえば、日付値に数値を加算しようとした場合、Excel と同じように、PowerPivot は関数のコンテキストで演算を解釈し、その数値を共通のデータ型に変換してから、対象の形式 (日付) で結果を出力します。
ただし、正常に変換できる値に関しては、いくつかの制限があります。 現在の操作との互換性が、値または列のデータ型にないと、DAX からエラーが返されます。 また、PowerPivot ブックにインポートしてある既存のデータのデータ型を明示的に変更、変換、またはキャストできるような関数は、DAX にはありません。
重要
PowerPivot では、Excel で使用されるバリアント データ型はサポートされません。したがって、データの読み込み時またはインポート時には、各列のデータが全体的に同じデータ型で統一されている必要があります。
関数には、文字列などのスカラー値を返すものもあれば、数値 (整数と実数の両方) や日時を扱うものもあります。 それぞれの関数で必要とされるデータ型は、「DAX 関数リファレンス」のセクションで説明しています。
テーブルは PowerPivot の新しいデータ型です。 複数の列および複数の行から成るデータを含むテーブルを、関数の引数として使用できます。 関数の中には、テーブルを返すものもあります。これらのテーブルはメモリ内に格納され、他の関数への引数として使用できます。
さまざまな数値データ型と日付/時刻データ型の詳細、および NULL や空の文字列の扱いの詳細については、「Data Types Supported in PowerPivot Workbooks」を参照してください。