DESCENDANTS (MDX)
返りタイプ
構文および詳細
DESCENDANTS(member_expression, level_expression, OPTIONAL_FLAG)
または、以下のようにします。
DESCENDANTS(member_expression, level_offset, OPTIONAL_FLAG)
-
member_expression は、メンバに評価される式です。以下の説明では、このメンバが 対象メンバです。
-
level_expression は、レベル識別子です。これは、対象メンバと同じ階層およびそれ以下の階層にあるレベル (より詳細なレベル) を識別する必要があります。
上記の例の代わりに、対象メンバを含むレベルを基準とした相対レベルを示す整数である level_offset を指定できます。例えば、次に低いレベルを指定するには 1 を使用します。
以下の説明では、対象レベル という語句は、level_expression または level_offset で指定されたレベルを表します。
-
OPTIONAL_FLAG は、メンバを返す必要があるレベルを指定します。このオプションは、対象レベルとの関係を説明します。OPTIONAL_FLAG を指定する場合、以下のキーワードのいずれかにする必要があります (大文字と小文字の区別はありません)。
-
SELF (既定) — 対象レベルのメンバである子孫 のみを返します。
-
AFTER — 対象レベル未満のすべてのレベルのメンバである子孫を返します。
-
BEFORE — 対象メンバ以下のすべての子孫を返します。つまり、対象レベルより上のすべてのレベルのメンバである子孫を返し、対象メンバも返します。
-
BEFORE_AND_AFTER — 対象レベルの上と下の両方の子孫を返しますが、対象レベルのメンバは含みません。
-
SELF_AND_AFTER — 対象レベルのメンバである子孫および対象レベルより下のすべてのレベルの子孫を返します。
-
SELF_AND_BEFORE — 対象レベルのメンバである子孫、指定したレベルより上のすべてのレベルに属している子孫、および対象メンバを返します。
-
SELF_BEFORE_AFTER — 対象メンバを含むすべてのレベルの子孫を返します。
この場合、対象レベルは結果に影響を与えません。
-
この関数が複数のレベルのメンバを返す場合、その階層が以下のようにメンバの順序に影響します。より高いレベルのメンバの後に次に低いレベルの子が続き、さらにより高いレベルの次のメンバが続き、以下同様になります。SELF_AND_AFTER の例を参照してください。
DESCENDANTS のこの実装は、オプションの LEAVES フラグをサポートしません。
例
参考に Patients キューブでは、BirthD ディメンジョンに以下のレベルが高いものから低いものの順に格納されます。
-
[BirthD].[H1].[Decade]
-
[BirthD].[H1].[Year]
-
[BirthD].[H1].[Quarter Year] (年と四半期を表します)
-
[BirthD].[H1].[Period] (年と月を表します)
-
[BirthD].[H1].[Date] (年、月、日を表します)
以下の例では、1990 年の [BirthD].[H1].[Period] レベル内のすべての子孫を取得します。
SELECT DESCENDANTS(birthd.1990,birthd.period) ON 1 FROM patients
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 *
この例では OPTIONAL_FLAG に既定値 (SELF) を使用するため、この関数は期間レベルのメンバである 1990 の子孫のみを返します。
以下のバリエーションは NON EMPTY を使用するため、患者が生まれなかった期間をフィルタで除外します。
SELECT NON EMPTY DESCENDANTS(birthd.1990,birthd.period) ON 1 FROM patients
1 Feb-1990 2
2 Mar-1990 1
3 Apr-1990 1
4 May-1990 1
5 Jul-1990 2
6 Aug-1990 2
7 Sep-1990 1
8 Oct-1990 3
9 Nov-1990 1
この期間レベルは、年レベルの 2 レベル下で、以下のクエリ (level_offset に 2 を使用) は最初のクエリと同等です。
SELECT DESCENDANTS(birthd.1990,2) ON 1 FROM patients
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 *
次のバリエーションは AFTER を使用します。
SELECT DESCENDANTS(birthd.1990,birthd.period,AFTER) ON 1 FROM patients
1 Jan 1 1990 *
2 Jan 2 1990 *
3 Jan 3 1990 *
...
363 Dec 29 1990 *
364 Dec 30 1990 *
365 Dec 31 1990 *
この例は、期間レベルの下のすべてのレベルの 1990 の子孫を返します。この場合、下のレベルは日付の 1 つしかありません。これは、年、月、日に対応します。
次のバリエーションは SELF_AND_AFTER を使用します。この例は、複数のレベルのメンバを返し、これらのメンバが返される順序を示します。
SELECT DESCENDANTS(birthd.1990,birthd.period,SELF_AND_AFTER) ON 1 FROM patients
1 Jan-1990 *
2 Jan 1 1990 *
3 Jan 2 1990 *
4 Jan 3 1990 *
...
33 Feb-1990 2
34 Feb 1 1990 *
35 Feb 2 1990 *
36 Feb 3 1990 1
...
346 Dec-1990 *
347 Dec 1 1990 *
348 Dec 2 1990 *
349 Dec 3 1990 *
...
377 Dec 31 1990 *
次のバリエーションは BEFORE を使用します。
SELECT DESCENDANTS(birthd.1990,birthd.period,BEFORE) ON 1 FROM patients
1 1990 14
2 Q1 1990 3
3 Q2 1990 2
4 Q3 1990 5
5 Q4 1990 4
この場合、クエリは、期間レベルの上のレベルのメンバである 1990 のすべての子孫を取得します (つまり、四半期レベルのメンバを返します)。1990 も返されます。