25 属性ディメンションおよび階層オブジェクト
属性ディメンションはデータ・ソースを参照し、属性およびレベルを指定します。階層はレベルを階層的に編成します。
属性ディメンションおよび階層については、次のトピックで説明しています。
25.1 属性ディメンションおよび階層について
属性ディメンションは、データ・ソース、属性およびレベルを指定します。階層はレベルを階層的に編成します。
属性ディメンションは、使用するデータ・ソースを指定し、そのソースの列を属性として指定します。一部またはすべての属性のレベルを指定し、レベル間の属性の関係を決定します。
階層では、属性ディメンションのレベル間の階層リレーションシップを定義します。属性ディメンションおよび階層は、分析ビュー・オブジェクトのディメンション・メンバーを提供します。
ディメンションおよび階層に関連するメタデータの多くは、属性ディメンションで定義されます。階層は、使用する属性ディメンションのすべてのメタデータを継承します。これにより、属性およびレベルのメタデータが多くの階層で再使用され、一貫性が促進され、階層の定義を単純化できます。
属性ディメンションについて
属性ディメンションには次の特性があります。
-
データ・ソース(通常はスター・スキーマのディメンション表ですが、ビュー、外部表またはリモート表である場合があります。ディメンション表の各列は階層に設定できます)
-
ディメンション・タイプ(
STANDARD
またはTIME
) -
属性(データ・ソースの列)
-
レベル(同じレベルの集計にあるすべての値のグループを表します)
-
階層属性(階層によって使用され、レベル間の階層関係を示す)
-
1つのメンバーのみを持つ暗黙的なALLレベル(属性ディメンションを使用する階層の最も高いレベルです)
-
任意の数の階層が使用できます
属性ディメンションには次のオプションの特性もあります。
-
メタデータまたはそれ自体をアプリケーション・コンテナと共有するように指定できます
-
レベル・メンバーの順序を指定できます
-
属性ディメンション自体、属性、一部の階層属性、レベルおよびALLメンバーの分類を指定できます。アプリケーションが問合せに使用したり、問合せ結果を表示するために使用したりできるメタデータが分類によって提供されます
含まれているレベルによって判別される属性は、階層の列になる属性を指定するため、その階層を参照する分析ビューの属性となります。
属性ディメンションおよびレベル・タイプについて
属性ディメンションは、STANDARD
タイプまたはTIME
タイプにすることができます。機能的には、STANDARD
タイプおよびTIME
タイプの属性ディメンションは同じです。ただし、TIME
タイプの属性ディメンションの各レベルでは、レベル・タイプを指定する必要があります(レベル・メンバーの値はそのタイプである必要はありません)。たとえば、TIME
タイプの属性ディメンションでは、レベル・タイプQUARTERS
のSEASONという名前のレベルを作成できますが、値は季節の名前になります。レベル・タイプは任意に選択した用途に使用できます。
STANDARD
タイプの属性ディメンションのレベルは、STANDARD
タイプです。STANDARD
タイプの属性ディメンションのレベルには、レベル・タイプを指定する必要はありません。
TIME
タイプの属性ディメンションのレベルは、次のレベル・タイプのいずれかである必要があります。
-
YEARS
-
HALF_YEARS
-
QUARTERS
-
MONTHS
-
WEEKS
-
DAYS
-
HOURS
-
MINUTES
-
SECONDS
階層について
階層の特性は次のとおりです。
-
属性ディメンション
-
属性ディメンションのレベルの階層順序
-
レベルの各属性(判別された属性を含む)の列
-
階層属性の列
-
階層の各レベルの各メンバーの行、および単一の最上位の集計値を表す暗黙的なALLレベルの行
-
属性ディメンションから継承したメタデータ
-
SQLの
SELECT
文のFROM
句に使用できます
階層には次のオプションの特性もあります。
-
メタデータまたはそれ自体をアプリケーション・コンテナと共有するように指定できます
-
階層自体および階層属性の分類を指定できます
例25-1 単純な属性ディメンション
属性ディメンションは、キー属性のみを定義したレベルと属性のリストのような単純なものにすることができます。この例は、TIME_DIM表のYEAR_ID、QUARTER_IDおよびMONTH_ID列のみを属性として指定した属性ディメンションを作成しています。
CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME -- TYPE TIME enables time series calculations
USING time_dim -- References the TIME_DIM table
ATTRIBUTES -- A list of table columns to be used as attributes
(year_id,
quarter_id,
month_id)
LEVEL MONTH -- A level
LEVEL TYPE MONTHS -- The level type
KEY month_id -- Attribute with unique values
LEVEL QUARTER
LEVEL TYPE QUARTERS
KEY quarter_id
LEVEL YEAR
LEVEL TYPE YEARS
KEY year_id;
TIME_DIM表の詳細は、例のデータとスクリプトについてを参照してください。
TIME_DIM表の各_ID列は、属性リストに含まれています。デフォルトでは、属性の名前はディメンション表の列の名前です。属性に異なる名前を指定するには、定義でAS
alias
句を使用します。
レベルはKEY
プロパティ(レベルで唯一の必須のプロパティです)を使用して各属性に作成されます。
例25-2 単純な階層
CREATE OR REPLACE HIERARCHY time_hier -- Hierarchy name
USING time_attr_dim -- Refers to the TIME_ATTR_DIM attribute dimension
(month CHILD OF -- Levels in the attribute dimension
quarter CHILD OF
year);
階層には、属性ディメンションの各属性および階層属性の列があります。
SELECT column_name from ALL_HIER_COLUMNS WHERE HIER_NAME = 'TIME_HIER';
図time_hier_columns.pngの説明
次の文は、TIME_ATTR_DIMが例25-1で定義された属性ディメンションである場合に、TIME_HIERから属性列および一部の階層列を選択しています。
SELECT year_id, quarter_id, month_id,
member_name, member_unique_name
member_caption, member_description
FROM time_hier
ORDER BY hier_order;
問合せ結果の一部を示します。
図time_hier_col_subset.pngの説明
25.2 属性および階層属性
通常、属性ディメンションの属性はソース表またはビューの列を参照しています。階層属性は、階層のメンバーに関する情報を提供します。
属性ディメンションで、属性は参照するソース表またはビューの列を指定します。属性のデフォルト名は表の列名です。属性に異なる名前を指定するには、SQLのSELECT
句の別名に似た構文を使用します。レベルは属性を使用して定義し、属性間の関係はレベルを使用して定義します。属性は、階層に含まれるレベル、およびレベルに定義されている属性の関係に応じて、階層の列として表示されます。
階層属性は次のとおりです。
-
DEPTH
は階層メンバーのレベルの深さです。ALLレベルは深さ0 (ゼロ)です -
HIER_ORDER
は階層内のメンバーの順序です -
IS_LEAF
は、メンバーが階層の最も低い(リーフ)レベルにあるかどうかを示すブール値です -
LEVEL_NAME
は、属性ディメンションの定義内のレベルの名前です -
MEMBER_NAME
は、属性ディメンションの定義内のメンバーの名前です -
属性ディメンションまたは階層の定義に値を指定していない場合、
MEMBER_CAPTION
はNULL
です -
属性ディメンションまたは階層の定義に値を指定していない場合、
MEMBER_DESCRIPTION
はNULL
です -
MEMBER_UNIQUE_NAME
は、階層内で一意であることが保証されている名前であり、レベル名、祖先およびキー属性値を連結したものです -
PARENT_LEVEL_NAME
は、現在のメンバーの親のレベルの名前です -
PARENT_UNIQUE_NAME
は、現在のメンバーの親のMEMBER_UNIQUE_NAME
です
階層属性値は、レベルおよび系統で構成されます。系統にはメンバーのキー値が含まれています。系統の各コンポーネントは角括弧で囲み、コンポーネントはピリオドで区切ります。コンポーネント値に右角括弧が含まれている場合は、2つの右角括弧を使用して表されます。
例25-3 階層属性への値の設定
これは、属性ディメンションおよび階層についての単純な属性ディメンションに基づいた階層に対する問合せの結果の一部です。
図time_hier_col_subset.pngの説明
階層は機能していますが、いくつかの重要な機能が欠けています。MEMBER_NAME列は読みやすいとは言えず、MEMBER_CAPTION列およびMEMBER_DESCRIPTION列にはデータが返されていません。
time_attr_dim属性ディメンションのこの新しい定義には、TIME_DIM表の_NAME列が含まれています。レベルの定義では、階層属性MEMBER_NAME
、MEMBER_CAPTION
およびMEMBER_DESCRIPTION
の値が含まれている属性を指定しています。この定義は、レベル・メンバーの指定値を持つ属性ディメンションを使用する階層を提供します。
CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME
USING time_dim
ATTRIBUTES
(year_id,
year_name,
quarter_id,
quarter_name,
month_id,
month_name,
month_long_name)
LEVEL MONTH
LEVEL TYPE MONTHS
KEY month_id
MEMBER NAME month_name
MEMBER CAPTION month_name
MEMBER DESCRIPTION month_long_name
LEVEL QUARTER
LEVEL TYPE QUARTERS
KEY quarter_id
MEMBER NAME quarter_name
MEMBER CAPTION quarter_name
MEMBER DESCRIPTION quarter_name
LEVEL YEAR
LEVEL TYPE YEARS
KEY year_id
MEMBER NAME year_name
MEMBER CAPTION year_name
MEMBER DESCRIPTION year_name;
この文は、TIME_HIER階層から属性列およびいくつかの階層列を選択します。
SELECT year_id, quarter_id, month_id,
member_name, member_unique_name,
member_caption, member_description
FROM time_hier
ORDER BY hier_order;
問合せ結果の一部を示します。
図time_hier_col_subset_hier_attrs.pngの説明
期間の順序は、時系列の計算のレポートのためにはまだ正しくありません。たとえば、1月の前に2月があります。レベルのソート順を指定する例については、レベルの順序を参照してください。
25.3 レベルの順序
属性ディメンション・レベル・メンバーの順序を指定できます。
属性ディメンションのレベル定義のORDER
BY
句を使用すると、レベルのメンバーの順序を指定できます。デフォルトでは、属性ディメンション・レベルの値は、MEMBER_NAME
値によってアルファベット順にソートされます。メンバー名を指定しない場合、レベルはKEY
属性値で順序付けされます。
ORDER BY
句では、NULL
値を順序の最初または最後のどちらにするかも指定します。属性がレベルによって判別されない場合は、MIN
またはMAX
式を指定できます(デフォルトはMIN
です)。
例25-4 最終日の追加
この例は、最終日属性をtime_attr_dim属性ディメンションの定義に追加しています。
CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME
USING time_dim
ATTRIBUTES
(year_id,
year_name,
year_end_date,
quarter_id,
quarter_name,
quarter_end_date,
month_id,
month_name,
month_long_name,
month_end_date)
LEVEL MONTH
KEY month_id
MEMBER NAME month_name
MEMBER CAPTION month_name
MEMBER DESCRIPTION month_long_name
ORDER BY month_end_date
LEVEL QUARTER
KEY quarter_id
MEMBER NAME quarter_name
MEMBER CAPTION quarter_name
MEMBER DESCRIPTION quarter_name
ORDER BY quarter_end_date
LEVEL YEAR
KEY year_id
MEMBER NAME year_name
MEMBER CAPTION year_name
MEMBER DESCRIPTION year_name
ORDER BY year_end_date;
これはtime_hier階層の定義です。
CREATE OR REPLACE HIERARCHY time_hier
USING time_attr_dim
(month CHILD OF
quarter CHILD OF
year);
この問合せには階層の順序属性が含まれています。
SELECT year_id,
quarter_id,
month_id,
member_name,
hier_order
FROM time_hier
ORDER BY hier_order;
問合せ結果の一部を示します。
図time_hier_col_subset_orderby.pngの説明
レベルのメンバーが最終日でソートされるようになりました。
25.4 レベル・キー
レベルのキー属性は、レベル・メンバーのデータ・ソースを指定します。
属性ディメンション・レベルは、レベルのメンバーを指定するキー属性およびオプションの代替キー属性を指定します。
レベルには、単一の属性、または複合キーの場合は複数の属性によって定義されるキーがある必要があります。キーの各個別値によって、そのレベルの属性ディメンション・メンバーが定義されます。
レベルは、1つ以上の代替キーを持つこともできます。代替キーはレベル・キーと1対1の関係である必要があります。代替キーとして指定する属性は、レベルの各メンバーのキー属性に対して一意の値である必要があります。
例25-5 PRODUCT_ATTR_DIM属性ディメンションの作成
この例は、product_attr_dim属性ディメンションを作成しています。LEVEL句には、キーと代替キーが指定されています。
CREATE OR REPLACE ATTRIBUTE DIMENSION product_attr_dim
USING product_dim
ATTRIBUTES
(department_id,
department_name,
category_id,
category_name)
LEVEL DEPARTMENT
KEY department_id
ALTERNATE KEY department_name
MEMBER NAME department_name
MEMBER CAPTION department_name
ORDER BY department_name
LEVEL CATEGORY
KEY category_id
ALTERNATE KEY category_name
MEMBER NAME category_name
MEMBER CAPTION category_name
ORDER BY category_name
DETERMINES(department_id)
ALL MEMBER NAME 'ALL PRODUCTS';
25.5 属性の関係の決定
レベルの属性によって他の属性の値が判別されるように指定できます。
属性ディメンション定義のDETERMINES
句を使用すると、レベルのキー属性と他の属性の関係を指定できます。ある属性の各値に対する別の属性の値が1つのみである場合は、ある属性の値によって別の属性の値が決まります。たとえば、MONTH_IDの各値に対しては1つのQUARTER_ID値のみがあり、MONTH_IDによってQUARTER_IDが決まります。
レベルによって判別される属性は、その属性ディメンションを使用する階層に含められます。DETERMINES
句に指定する属性は、別々のレベル・メンバーで値が同じであってもかまいません。レベルによってキーおよび代替キーの属性が暗黙的に決定されますが、DETERMINES
句の属性と異なり、それらの属性は一意の値である必要があります。
DETERMINES
句によって指定される関係では、次のことを行うことができます。
-
階層によって返される行数の変更
-
特定の属性によって特定の行のデータが返されるかどうかの制御
-
分析ビューの問合せ時に生成されるSQLの単純化
判別される属性を指定すると、階層または分析ビューがメンバーの一意の値を判別するために役立ちます。属性がレベルによって判別される場合は、判別される属性と階層メンバーの関係を識別する属性値を問合せに明示的に指定する必要がありません。たとえば、QUALIFY
の計算では一意に識別された階層メンバーが必要となります。DETERMINES
句で属性を省略した場合は、QUALIFY
の計算を使用する分析ビューのメジャーで、一意のメンバーを識別するためにそれらの属性を明示的に指定する必要があります。
判別される属性とキーおよび代替キーの属性の関係は、属性ディメンションまたは属性ディメンションを使用する階層で検証または施行されません。関係を検証するには、ソース表またはビューのデータを検査するPL/SQLプロシージャDBMS_HIERARCHY.VALIDATE_HIERARCHY
を使用します。
DETERMINES
句を使用する場合は、次のことを考慮してください。
-
低いレベルは、判別された祖先のレベルの属性を継承します。このため、低いレベルのキーによって親レベルの値が決まる場合は、親レベルのキー属性値を低いレベルの
DETERMINES
句に含めることをお薦めします。 -
MEMBER
NAME
、MEMBER
CAPTION
、MEMBER
DESCRIPTION
およびORDER
BY
プロパティの値は、KEY
属性値によって決まることが想定されます。それらのプロパティの属性をDETERMINES
句に含める必要はありません。ただし、それらの属性のデータがKEY
属性の各値に対して1つの値のみを持つことを確認する必要があります。
使用上のノート
DETERMINES
句を使用する場合は、次のことを考慮してください。
-
低いレベルのキーによって親レベルの値が決まる場合は、階層内の親レベルの
KEY
属性をDETERMINES
句に含めます。低いレベルは、判別された祖先のレベルの属性を継承します。このため、親レベルのキー属性値を低いレベルのDETERMINES
句に含めることをお薦めします。 -
MEMBER
NAME
、MEMBER
CAPTION
、MEMBER
DESCRIPTION
およびORDER
BY
プロパティの値は、KEY
属性値によって決まることが想定されます。それらのプロパティの属性をDETERMINES
句に含める必要はありません。ただし、それらの属性のデータがKEY
属性の各値に対して1つの値のみを持つことを確認する必要があります。
例25-6 DETERMINES句の追加
この例は、time_attr_dimのレベルにDETERMINES
句を追加しています。
CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim
DIMENSION TYPE TIME
USING time_dim
ATTRIBUTES
(year_id,
year_name,
year_end_date,
quarter_id,
quarter_name,
quarter_end_date,
month_id,
month_name,
month_long_name,
month_end_date)
LEVEL MONTH
LEVEL TYPE MONTHS
KEY month_id
MEMBER NAME month_name
MEMBER CAPTION month_name
MEMBER DESCRIPTION month_long_name
ORDER BY month_end_date
DETERMINES (quarter_id)
LEVEL QUARTER
LEVEL TYPE QUARTERS
KEY quarter_id
MEMBER NAME quarter_name
MEMBER CAPTION quarter_name
MEMBER DESCRIPTION quarter_name
ORDER BY quarter_end_date
DETERMINES (year_id)
LEVEL YEAR
LEVEL TYPE YEARS
KEY year_id
MEMBER NAME year_name
MEMBER CAPTION year_name
MEMBER DESCRIPTION year_name
ORDER BY year_end_date;
TIME_HIER階層からLEVEL_NAME、_IDおよびMEMBER_UNIQUE_NAME列を選択します。
SELECT level_name,
year_id,
quarter_id,
month_id,
member_unique_name
FROM time_hier
ORDER BY hier_order;
前の問合せの次の結果に示されているように、月、四半期および年の属性の間の関係が階層で認識されるようになりました。MEMBER_UNIQUE_NAME
値は、レベル名およびKEY
属性値のみから作成されるようになりました。例25-3に示されているような完全な系統を含める必要はなくなりました。
図time_hier_col_subset_determines.pngの説明