計算メンバの定義
ここでは、計算メンバ (計算メジャーを含む) を Business Intelligence キューブに追加する方法を説明します。
ユーザは、アナライザ内で計算メジャー、計算メンバ、および名前付きセットを追加作成できます。
MDX の用語では、計算メジャーは、単に計算メンバの別の表現です。このドキュメントでは、わかりやすくするために非標準的な語句である計算メジャーを使用します。
"このドキュメントに示したサンプルのアクセス方法" も参照してください。
計算メジャーの定義
計算メジャーを追加する手順は以下のとおりです。
-
[要素を追加] をクリックします。
ダイアログ・ボックスが表示されます。
-
[新規項目名の入力] に、メジャーの名前を入力します。
"モデル要素の名前" を参照してください。
-
[計算メンバ (メジャー)] をクリックします。
-
[OK] をクリックします。
-
モデル・ビューワで計算メジャーを選択します ([計算メンバ] セクション内)。
-
新しいメンバを定義する MDX 式を指定します。そのためには、以下のいずれかの操作を行います。
-
[値式] に式を直接入力します。
-
Expression Builder を使用します。このツールは、キューブの任意の部分に対して正しい MDX 識別子を容易に取得できるようにすることを目的としています。このツールにアクセスするには、[式] の横にある虫眼鏡をクリックします。左側の領域には、すべてのメジャーおよびレベルを含むキューブのコンテンツがリストされます。右側の領域には、作成している式が表示されます。項目を式に追加するには、項目を左側の領域から式にドラッグ・アンド・ドロップします。項目は、式の最後に追加されますが、式の別の部分に移動することも可能です。
以下のセクションでは、いくつかの式の例を示しています。その他の例については、HoleFoods キューブおよび Patients キューブを参照してください。
-
アーキテクトの [メジャー] グループに、この新しいメジャーが他のメジャーと共に表示されます。
このページの後半にある "計算メジャーのリストの追加フィルタの指定" も参照してください。
計算メジャーの MDX レシピ
計算メジャーでは、定義として使用する MDX 式が数値式であることが要求されます。MDX で数値式を作成するすべての方法については、"数値式" のセクションを参照してください。
InterSystems MDX の概要は、"InterSystems MDX の使用法" を参照してください。
このセクションでは、以下のシナリオのレシピについて説明します。
-
フィルタ処理メジャー (場合によっては NULL)
-
KPI またはプラグインを使用するメジャー ("InterSystems Business Intelligence の上級モデリング" を参照)
サンプルは、HoleFoods キューブおよび Patients キューブを参照してください。
あるプラグインに基づく別の計算メジャーに基づく計算メジャーを定義しないでください (プラグインの詳細は、"InterSystems Business Intelligence の上級モデリング" を参照してください)。
他のメジャーに基づくメジャー
以下のような式を介して、あるメジャーが別のメジャーに基づくようにする方法が一般的です。
([MEASURES].[my measure 1] + [MEASURES].[my measure 2]) / [MEASURES].[my measure 3]
より正式には、式は数値で評価される MDX 式で、以下の要素を含めることができます。
-
メジャーへの参照。構文は、以下のとおりです。
[MEASURES].[measure name]
または、以下のようにします。
MEASURES.[measure name]
メジャー名が英数字のみで構成され、先頭が数字でなく、MDX の予約語でない場合は、メジャー名を囲む角括弧を省略できます。
式では、大文字と小文字は区別されません。
-
数値リテラル。例えば、37 です。
-
パーセンテージ・リテラル。例えば、10% です。
数値とパーセント記号の間にスペースを入れることはできません。
-
ピボット変数。"ピボット変数の定義と使用" を参照してください。
ピボット変数を参照するには、構文 $variable.variablename を使用します。variablename はロジカル変数名です。この構文では大文字と小文字は区別されません。ピボット変数名も同様です。
-
算術演算子。InterSystems IRIS Business Intelligence では、+ (加算)、- (減算)、/ (除算)、および * (乗算) の標準的な算術演算子がサポートされます。また、DeepSee II では、+ (正)、および - (負) の標準単項演算子もサポートされます。
優先順位を制御する括弧も使用できます。
例えば、MEASURES.[%COUNT] / 100 です。
-
数値を返す MDX 関数。AVG、MAX、COUNT など、MDX 関数の多くが数値を返します。詳細は、"InterSystems MDX リファレンス" を参照してください。関数名では、大文字と小文字は区別されません。
ピボット変数を乗数として使用するメジャー
ピボット変数を乗数として使用するメジャーを定義するには、以下のような [式] を使用します。
measures.[measure A]*$variable.myQueryVariable
myQueryVariable は、ピボット変数のロジカル名です。このシナリオでは、数値を提供するリテラル・ピボット変数を使用します。"ピボット変数の定義と使用" を参照してください。構文では大文字と小文字は区別されません。ピボット変数名も同様です。
集約値のパーセンテージ
合計レコード数のパーセンテージや他の集約値のパーセンテージの計算が必要な場合も多くあります。このような場合は、インターシステムズによる拡張機能の %MDX 関数を使用できます。この関数は、単一の値を返す MDX サブクエリを実行し、関数を実行したコンテキストの影響を受けない値を返します。このため、以下のような式を使用してパーセンテージを計算できます。
100 * MEASURES.[measure A] / %MDX("SELECT MEASURES.[measure A] ON 0 FROM mycube")
このサブクエリ SELECT MEASURES.[measure A] ON 0 FROM mycube は、指定されたメジャーをキューブから選択して、そのメジャーをすべてのレコード対して集約します。
以下はその例です。
100 * MEASURES.[%COUNT]/%MDX("SELECT MEASURES.[%COUNT] ON 0 FROM patients")
Count メジャーの場合は、より単純な以下のサブクエリを使用できます。
100 * MEASURES.[%COUNT]/%MDX("SELECT FROM patients")
以下は、Percent of All Patients 計算メジャーを使用する例です。このメジャーは前述の式で定義されています。
個別のメンバ数
場合によっては、特定のセルに対して、特定のレベルの個別のメンバ数のカウントが必要になります。例えば、DocD ディメンジョンにレベル Doctor Group と Doctor が含まれています。計算メジャー Unique Doctor Count では、以下の式を使用します。この式では、Doctor レベルを使用しています。
COUNT([docd].[h1].[doctor].MEMBERS,EXCLUDEEMPTY)
このメジャーは、ピボット・テーブルで以下のように使用できます。
準加法メジャー
準加法メジャーは、すべてではなくほとんどのディメンジョンを集約するメジャーです。例えば、銀行残高は特定の時点のスナップショットであるため、顧客の銀行残高を経時的に加算することはできません。このようなメジャーを作成するには、インターシステムズによる MDX への拡張機能である %LAST 関数を使用できます。
以下のメジャーについて考えてみます。
-
Balance はソース・プロパティ CurrentBalance に基づき、合計によって集約されます。
このメジャーの経時的な集計は不適切な結果が生じるため、回避する必要があります。このためこのメジャーの使用は行または列に時間レベルが含まれるピボット・テーブルのみに限定する必要があります。
-
Transactions は、ソース・プロパティ TxCount に基づき、合計によって集約されます。
LastBalance と呼ばれる計算メジャーを定義して、式には次の式を使用します。
%LAST(Date.Day.Members,Measures.Balance)
%LAST 関数は、指定されたセットの各メンバに対して評価された、メジャーの最終的な欠落のない値を返します。この場合は、値が存在する最後の日が検索され、その値が返されます。
フィルタ処理メジャー
通常のメジャーでは、ファクト・テーブル内でソース値が NULL でないすべてのレコードが考慮されます。状況によっては、以下のように動作するフィルタ処理メジャーの定義が必要になります。
-
特定のレコードでメジャーが NULL である。
-
その他のレコードについては、そのメジャーに値が存在する。
フィルタ処理メジャーには、次のような式を使用します。
AGGREGATE([DIMD].[HIER].[LEVEL].[member name],[MEASURES].[my measure])
この場合、AGGREGATE 関数は、指定されたメンバに属するすべてのレコードを通じて、指定された値を集約します。
例えば、Patients サンプルに Avg Test Score メジャーがあります。これは、テストの値が NULL でないすべての患者の平均テスト・スコアです。Avg Test Score メジャーに加え、冠動脈性心疾患 (CHD 診断) を持つ患者の平均テスト・スコアのみを示す列も表示する必要があるとします。このため、メジャー Avg Test Score - CHD が必要になります。この場合、以下の式を指定した計算メジャーを作成できます。
AGGREGATE(diagd.h1.diagnoses.chd,MEASURES.[avg test score])
KPI またはプラグインを使用するメジャー
任意の KPI またはプラグイン (すべて説明済み) に対して、そこから値を取得する計算メジャーを作成できます。このメジャーは、ドラッグして、アナライザにドロップできます。このような計算メジャーを作成するには、[式] で以下の形式の MDX 式を使用します。
%KPI(kpiname,propertyname,seriesname,"%CONTEXT")
kpiname は KPI またはプラグインの名前、propertyname はプロパティまたは列の名前、seriesname は系列の名前です。seriesname は省略できます。省略した場合、この関数は KPI またはプラグインの最初の系列にアクセスします。
MDX ベースの KPI またはプラグインの場合、コンテキスト情報を格納するパラメータを指定できます。"%CONTEXT" は、KPI またはプラグインに行、列、およびフィルタのコンテキストを提供する特殊なパラメータです。この情報は、KPI またはプラグインで使用されるベース MDX クエリに渡されます。このパラメータの既定値は "all" で、行、列、およびフィルタのコンテキストを組み合わせて使用します。他のオプションの詳細は、"InterSystems MDX リファレンス" の "%KPI" 関数を参照してください。
例 (系列が 1 つだけの KPI またはプラグインの場合) :
%KPI("PluginDemo2","Count",,"%CONTEXT")
別の例として、サンプル中央値プラグイン (%DeepSee.PlugIn.MedianOpens in a new tab) を使用する計算メジャーを定義できます。そのためには、以下の式を使用します。
%KPI("%DeepSee.Median","MEDIAN",1,"%measure","Amount Sold","%CONTEXT")
計算メンバ (メジャー以外) の定義
メジャーでない計算メンバを追加する手順は以下のとおりです。
-
[要素を追加] をクリックします。
ダイアログ・ボックスが表示されます。
-
[新規項目名の入力] に、メンバの名前を入力します。
"モデル要素の名前" を参照してください。
-
[計算メンバ (ディメンジョン)] をクリックします。
-
[OK] をクリックします。
-
モデル・ビューワで計算メンバを選択します ([計算メンバ] セクション内)。
-
[ディメンジョン] に、このメンバが属するディメンジョンの名前を入力します。
非計算メンバが含まれている既存のディメンジョンや新規のディメンジョンなど、任意のディメンジョンを指定できます。
-
新しいメンバを定義する MDX 式を指定します。そのためには、以下のいずれかの操作を行います。
-
[値式] に式を直接入力します。
-
Expression Builder を使用します。このツールは、キューブの任意の部分に対して正しい MDX 識別子を容易に取得できるようにすることを目的としています。このツールにアクセスするには、[式] の横にある虫眼鏡をクリックします。左側の領域には、すべてのメジャーおよびレベルを含むキューブのコンテンツがリストされます。右側の領域には、作成している式が表示されます。項目を式に追加するには、項目を左側の領域から式にドラッグ・アンド・ドロップします。項目は、式の最後に追加されますが、式の別の部分に移動することも可能です。
次のセクションには、いくつかのレシピが用意されています。
詳細と例は、"InterSystems MDX リファレンス" の "WITH 節" を参照してください。
Patients キューブはいくつかのサンプルを定義します。標準メンバの他に 2 つの計算メンバを含む ColorD ディメンジョンを参照してください。
-
メジャー以外の計算メンバの MDX レシピ
ここでは、一般的なシナリオのいくつかにおけるメジャー以外の計算メンバのレシピについて説明します。
一般的な構文は、"InterSystems MDX リファレンス" の "WITH 節" を参照してください。
InterSystems MDX の概要は、"InterSystems MDX の使用法" を参照してください。
このセクションでは、以下のシナリオのレシピについて説明します。
-
複数のレベルのメンバの結合 (特にフィルタリング)
サンプルは、Patients キューブを参照してください。標準メンバの他に 2 つの計算メンバを含む ColorD ディメンジョン。
年齢メンバの定義
年齢別にレコードをグループ化したメンバを用意すると役に立つことが普通です。このようなメンバを定義するには、既存の時間レベルと専用の NOW メンバを使用します。例えば、HoleFoods サンプルの、MonthSold レベルを考えてみましょう。以下の式を使用して、3 Months Ago という名前の計算メジャーを定義することができます。
[dateofsale].[actual].[monthsold].[now-3]
一連の年齢メンバを定義して、年齢別にグループを作成できます。例えば、以下のメンバを定義できます。
-
[ディメンジョン] :AgeGroups
[メンバ名] :1 から 2 年
[式] :%OR(DateOfSale.DaySold.[NOW-2y-1d]:[NOW-1y])
-
[ディメンジョン] :AgeGroups
[メンバ名] :2 から 3 年
[式] :%OR(DateOfSale.DaySold.[NOW-3y-1d]:[NOW-2y])
詳細およびオプションは、"InterSystems MDX リファレンス" の "日付/時間レベルの NOW メンバ" を参照してください。
メンバの集約
多くの場合、複数のメンバを結合する広い範囲のグループ化を定義すると便利です。そのためには、以下の形式の式を持つ、メジャー以外の計算メンバを作成します。
%OR({member_expression, member_expression,...})
以下はその例です。
%OR({[colord].[h1].[favorite color].[red],
[colord].[h1].[favorite color].[blue],
[colord].[h1].[favorite color].[yellow]})
どんな場合でも、非メジャー・メンバは、それぞれが、一連のレコードを参照します。%OR 関数を使用するメンバを作成する際は、そのコンポーネント・メンバが使用するすべてのレコードを参照するメンバを新規作成します。
日付範囲の集約
%OR によって集約されるメンバの範囲を使用する形式も便利です。
%OR(member_expression_1:member_expression_n)
式 member_expression_1:member_expression_n は、member_expression_1 から member_expression_n までのすべてのメンバを返します (範囲の端点も含みます)。この形式を使用すると、日付範囲を簡潔な形式で表現できるため、特に時間レベルで役立ちます。
時間レベルでは、特殊な NOW メンバも使用できます。以下の式は、90 日前から本日までの売上レコードを集計します。
%OR(DateOfSale.DaySold.[NOW-90]:DateOfSale.DaySold.[NOW])
または、これに相当する以下の形式を使用します。
%OR(DateOfSale.DaySold.[NOW-90]:[NOW])
%TIMERANGE 関数も使用できます。これによって、片側だけ指定されている範囲のすべてのメンバで構成されるメンバを定義できます。例えば、以下の式により 2009 メンバの後に開始する範囲を定義します。
%TIMERANGE(DateOfSale.YearSold.&[2009],,EXCLUSIVE)
%TIMERANGE 関数は時間レベルでのみサポートされ、リレーションシップではサポートされていません。
日付範囲の取得には、PERIODSTODATE 関数も使用できます。例えば、以下の式は、現在の年の初めから本日までの日付範囲を取得し、これらの日数を集約します。
%OR(PERIODSTODATE(DateOfSale.YearSold,DateOfSale.DaySold.[NOW]))
条件リストにより定義されるメンバの集約の定義
条件リストにより、プログラミングせずに Business Intelligence モデルをカスタマイズする方法が提供されます。条件リストは、キーと値のペアの単純なリスト (ただし、拡張可能) です ("条件リストの定義" を参照してください)。
用語リストは複数の方法で使用できます。1 つはメンバ・セットを作成する方法で、一般的にフィルタで使用します。この場合、%TERMLIST 関数と %OR 関数を使用します。以下の形式の式を持つ、メジャー以外の計算メンバを作成します。
%OR(%TERMLIST(term_list_name))
term_list_name は、用語リストの名前に評価される文字列です。
以下はその例です。
%OR(%TERMLIST("My Term List"))
この式は、用語リストで示されたメンバに属するすべてのレコードを参照します (%OR は複数のメンバを単一のメンバに結合することを思い出してください)。
%TERMLIST 関数には、オプションの 2 番目の引数があります。"EXCLUDE" をこの引数に指定すると、関数はそのレベルで用語リストにないすべてのメンバのセットを返します。
複数のディメンジョンに対してフィルタ処理するメンバの定義
メンバベース・フィルタは非常に役立つため、フィルタでの使用専用のメンバを作成するだけの価値があります。以下のような場合 (リテラル構文を表示しない) にフィルタが必要だとします。
Status = "discharged" and ERvisit = "yes" and PatientClass="infant"
また、このフィルタを多くの場所で使用する必要があるとします。
フィルタ式を繰り返し定義するのではなく、計算メンバを定義して使用できます。この計算メンバに、以下のような式を指定します。
%OR({member_expression,member_expression,...}
以下はその例です。
%OR({BIRTHD].[H1].[YEAR].[NOW],[ALLERSEVD].[H1].[ALLERGY SEVERITIES].[003 LIFE-THREATENING]}
式 ([BIRTHD].[H1].[YEAR].[NOW],[ALLERSEVD].[H1].[ALLERGY SEVERITIES].[003 LIFE-THREATENING]) はタプル式で、メンバ [BIRTHD].[H1].[YEAR].[NOW] とメンバ [ALLERSEVD].[H1].[ALLERGY SEVERITIES].[003 LIFE-THREATENING] の共通部分、つまり今年生まれた、生死にかかわるアレルギーを持つすべての患者を示します。
あるいは、より一般的に、以下の形式の式を使用します。
%OR({set_expression})
計算メジャーのリストの追加フィルタの指定
既定では、ユーザが詳細リストを表示する際、システムは、現在のコンテキスト (リストが要求されたコンテキスト) で使用されているソース・レコードごとに行を 1 つ表示します。指定された計算メジャーについて、詳細リストを表示する際にシステムが使用する追加フィルタを指定できます。
特定の計算メジャーについて、リストの追加フィルタを指定するには、以下の手順を実行します。
-
モデル・ビューワで、計算メジャーを選択します。
-
[詳細] 領域 で、[リスト・フィルタ] を MDX フィルタ式として指定します。式を作成するには、このフィールドに直接入力するか、虫眼鏡をクリックして、エディタで式を作成します。
MDX フィルタ式の詳細および例は、"サブジェクト領域のフィルタ処理" を参照してください。
また、通常メジャーには、リストを表示する際に使用する追加フィルタを含めることができます。構文は異なりますが、実質的な効果は同じになります。詳細および例は、"リストの追加フィルタの指定" を参照してください。