ディメンジョンおよび階層を使用した作業
ここでは、Business Intelligence の階層とディメンジョンについて説明します。これらの要素はレベルのコンテナですが、それぞれ独自の目的も持っています。
"BI サンプルのアクセス方法" も参照してください。
ディメンジョンと階層の概要
ほとんどの MDX 関数は、レベルまたはレベルのメンバを直接参照します。ただし MDX では、レベルは階層に属し、階層はディメンジョンに属します。階層とディメンジョンを使用することで、レベルで提供される機能を超えた機能が実現されます。
階層は、データを特に空間および時間を軸に組織化する、現実的で便利な方法です。例えば、市区町村を国でグループ化したり、国を地域でグループ化できます。このような場合、特定の国の子都市に対するクエリや、特定の国の親郵便地域に対するクエリを実行できると便利です。そこで、そのようなクエリの記述を可能にするために、キューブではレベル間に階層を定義でき、MDX には、階層を使用した作業を可能にする関数が用意されています。
MDX では、ディメンジョンに、レコードを同様に分類する方法を指定する 1 つ以上の階層が含まれます。2 つの異なる階層間、またはある階層のレベルと別の階層のレベルとの間に、形式化されたリレーションシップはありません。ディメンジョンの用途は、その階層やレベルの既定の動作を定義することです。
Measures ディメンジョン
メジャーはすべて、Measures と呼ばれる特殊なディメンジョンに属します。このディメンジョンには、名前のない単一の階層が暗黙的に含まれます。この階層には、レベルは含まれません。この階層のメンバはメジャーです。
All レベル
Measures ディメンジョン以外の各ディメンジョンでは、そのレベルの全階層に表示される All レベルという特殊な任意のレベルを定義できます。このレベルを定義した場合、このレベルには、All メンバという、キューブ内のすべてのレコードに対応するメンバ 1 つが格納されます。
指定したディメンジョンの All メンバの実際の名前は、キューブの定義によって決まります。例えば、サンプルでの AgeD ディメンジョンの All メンバは、All Patients になります。
例
MDX シェルで cube コマンドを使用した場合、demomdx キューブ内に以下の要素が表示されます。
Elements of cube 'demomdx':
-----------------------------------------
...
Dimensions
...
HomeD
H1
ZIP
City
...
HomeD ディメンジョンには 1 つの階層 (H1) が含まれており、この階層には以下の 2 つのレベルが含まれています。
-
ZIP レベル
-
City レベル
指定された階層で、レベルはその後にリストされているレベルの親になります。例えば、ZIP は City の親という意味です。より具体的には、ZIP の各メンバは、City の 1 つ以上のメンバの親です。つまり、簡潔に言うと、1 つのレベルは別のレベルの親ですが、実際のリレーションシップは、レベル間ではなくメンバ間にあります。この簡潔表現は必ずしも正確ではありませんが、便利なので広く使用されています。
以下の図は、HomeD.H1 階層のメンバ間のリレーションシップを示しています。
この階層の区別機能により、どの子要素もその親に対して一意になります。この例は、現実には郵便番号と市区町村には多対多のリレーションシップが存在するため形式的なものです。
階層のメンバへのアクセス
階層のメンバ (つまり、階層のすべてのレベルのすべてのメンバ) にアクセスするには、MEMBERS 関数を使用します。この場合、構文は以下のようになります。
[dimension_name].[hierarchy_name].MEMBERS
InterSystems MDX では、階層名を省略すると、指定されたディメンジョン内で最初に表示される階層を参照するものと見なされます。
例えば、DemoMDX キューブ内では、homed ディメンジョンに階層が 1 つだけ含まれています。以下のクエリは、その階層のメンバを示しています。
SELECT MEASURES.[%COUNT] ON 0, homed.MEMBERS ON 1 FROM demomdx
%COUNT
1 32006 215
2 Juniper 122
3 Spruce 93
4 32007 111
5 Redwood 111
6 34577 347
7 Cypress 112
8 Magnolia 114
9 Pine 121
10 36711 99
11 Centerville 99
12 38928 228
13 Cedar Falls 110
14 Elm Heights 118
階層に対して MEMBERS 関数を使用すると、メンバのセットが階層順で返されます。最初のメンバは All メンバです (存在する場合)。その後のメンバは、それぞれ以下のいずれかになります。
-
前のメンバの最初の子。
-
前のメンバの次の兄弟。
別の例として、以下のクエリはすべてのメジャーを示しています (%COUNT を除く)。
SELECT gend.gender.MEMBERS ON 0, MEASURES.MEMBERS ON 1 FROM demomdx
Female Male
1 Age 18,413 17,491
2 Avg Age 37.73 34.16
3 Allergy Count 326 332
4 Avg Allergy Count 1.08 1.07
5 Test Score 29,542 31,108
6 Avg Test Score 73.49 74.42
親子リレーションシップの使用法
システムには、親子リレーションシップを直接使用する以下の MDX 関数が用意されています。
-
CHILDREN は、指定したメンバに子があれば返します。返される値はメンバのセットで、その順序は、レベルに指定された既定の順序に基づきます。以下はその例です。
SELECT MEASURES.[%COUNT] ON 0, homed.zip.[34577].CHILDREN ON 1 FROM demomdx %COUNT 1 Cypress 112 2 Magnolia 114 3 Pine 121
別の例を示します。
SELECT MEASURES.[%COUNT] ON 0, homed.pine.CHILDREN ON 1 FROM demomdx %COUNT No Result
-
PARENT は、指定したメンバに親があれば返します。以下はその例です。
SELECT MEASURES.[%COUNT] ON 0, homed.city.[Elm Heights].PARENT ON 1 FROM demomdx %COUNT 38928 228
-
FIRSTCHILD は、指定したメンバに子があれば最初の子を返します。以下はその例です。
SELECT MEASURES.[%COUNT] ON 0, homed.zip.[34577].FIRSTCHILD ON 1 FROM demomdx %COUNT Cypress 112
-
LASTCHILD は、最後の子を返します (存在する場合)。
兄弟へのアクセス
システムには、メンバの兄弟にアクセスする以下の MDX 関数が用意されています。
-
FIRSTSIBLING は、指定したメンバに兄弟があれば最初の兄弟を返します。以下はその例です。
SELECT MEASURES.[%COUNT] ON 0, birthd.[Q1 1920].FIRSTSIBLING ON 1 FROM demomdx %COUNT Q1 1920 *
-
LASTSIBLING は、最後の兄弟を返します (存在する場合)。
-
SIBLINGS は、指定されたメンバとその兄弟をすべて返します。以下はその例です。
SELECT MEASURES.[%COUNT] ON 0, homed.cypress.SIBLINGS ON 1 FROM demomdx %COUNT 1 Cypress 112 2 Magnolia 114 3 Pine 121
従兄弟へのアクセス
COUSIN 関数を使用すると、上位レベルのメンバを指定して、従兄弟にアクセスすることができます。
例えば、以下のクエリは、1990 年内の Q1 1943 の従兄弟を検索します。
SELECT MEASURES.[%COUNT] ON 0, COUSIN(birthd.[Q1 1943],birthd.1990) ON1 FROM demomdx
%COUNT
Q1 1990 5
システムは相対的な位置を決定するために、キューブ定義で指定したように、レベル内のメンバの既定の順序を使用します。
子孫メンバへのアクセス
DESCENDANTS 関数を使用して、1 つ以上下位のレベル内で、指定されたメンバの子孫を取得できます。例えば、次のクエリは [BirthD].[H1].[Period] レベル内の 1990 年のすべての子孫を取得します。
SELECT DESCENDANTS(birthd.1990,birthd.period) ON 1 FROM demomdx
1 Jan-1990 *
2 Feb-1990 2
3 Mar-1990 1
4 Apr-1990 1
5 May-1990 1
6 Jun-1990 *
7 Jul-1990 2
8 Aug-1990 2
9 Sep-1990 1
10 Oct-1990 3
11 Nov-1990 1
12 Dec-1990 *
DESCENDANTS 関数では、階層のさまざまな領域内の子孫にアクセスするための多くのオプションが用意されていますが、上記の使用法が最も一般的なシナリオです。
繰り返し内での現在のメンバへのアクセス
典型的なクエリでは、メンバのセットを繰り返し処理して、それぞれを行として表示することがよくあります。また、各メンバに何らかの具体的な操作を順番に実行する場合もあります。そのためには、現在のコンテキストで使用されているメンバにアクセスする CURRENTMEMBER 関数を使用します。
例えば、以下のクエリを考えてみます。
SELECT MEASURES.[%COUNT] ON 0, homed.city.MEMBERS ON 1 FROM demomdx
%COUNT
1 Cedar Falls 110
2 Centerville 99
3 Cypress 112
4 Elm Heights 118
5 Juniper 122
6 Magnolia 114
7 Pine 121
8 Redwood 111
9 Spruce 93
このクエリでは、各市町村が 1 つの行になっています。表示されているデータは、%COUNT メジャーです。代わりに、市町村の人口を表示するとします。その場合のアクセスには、PROPERTIES 関数を使用します。この関数はその行で使用されるメンバへの参照が必要です。そのためには、CURRENTMEMBER 関数を使用します。この関数は以下のように呼び出すことができます。
[dimension_name].[hierarchy_name].CURRENTMEMBER
この関数を使用すると、以下のようなクエリのバリエーションが作成できます。
SELECT homed.h1.CURRENTMEMBER.PROPERTIES("Population") ON 0, homed.city.MEMBERS ON 1 FROM demomdx
H1
1 Cedar Falls 90,000
2 Centerville 49,000
3 Cypress 3,000
4 Elm Heights 33,194
5 Juniper 10,333
6 Magnolia 4,503
7 Pine 15,060
8 Redwood 29,192
9 Spruce 5,900
別の例として、以下のクエリは Doctor のメンバの内部キーを示しています。
SELECT docd.h1.CURRENTMEMBER.PROPERTIES("KEY") ON 0, docd.[doctor].MEMBERS ON 1 FROM demomdx
KEY
1 None <null>
2 Ahmed, Thelma 34
3 Alton, Chad 35
4 Black, Ashley 4
..