ヘッダーをスキップ
Oracle OLAP DMLリファレンス
11g リリース1(11.1)
E05732-02
  目次へ
目次
索引へ
索引

戻る
戻る
 
次へ
次へ
 

MODEL

MODELコマンドは、新規または既存のモデル・オブジェクトにまったく新しい仕様を入力するコマンドです。モデルに既存の仕様がある場合、その仕様は上書きされます。MODELを使用して、モデル・オブジェクトにモデル仕様を割り当てるには、定義は最新のもの、または現行のセッション中に検討されたものにする必要があります。そうでない場合は、最初にCONSIDER文を使用し、現行の定義にする必要があります。

MODEL文の代替文は、EDIT MODEL文です。この文は、OLAP Worksheet内でのみ使用できます。EDIT MODEL文を実行すると、モデル・オブジェクトの仕様を追加、削除または変更できる「編集」ウィンドウが開きます。

モデル・オブジェクトへの仕様の追加は、データをモデリングする際の一処理です。モデルの詳細は、「OLAP DMLモデル・オブジェクト」を参照してください。

構文

MODEL specification

引数

specification

次のOLAP DML文を1つ以上含む複数行のテキスト式。

SET(=)コマンド     
DIMENSION(モデル内)
INCLUDE

モデルの最大行数は、4,000行です。各文は、複数行のテキスト式で構成されています。コマンドライン・レベルでALLOCMAP文をコード化する際は、改行デリミタ(\n)で文を区切るか、JOINLINESを使用します。

モデルの仕様設計の詳細は、「モデルの仕様」を参照してください。

注意

モデルの仕様

モデルの仕様は、次のOLAP DML文で構成されます。

  1. 次のうちの1つ。

    • モデルに含める別のモデルの名前を指定するINCLUDE文(1文のみ)。詳細は、「モデルのネスト」を参照してください。

    • 「モデルにおけるDIMENSION文作成のガイドライン」に従ってコーディングした1つ以上のDIMENSION(モデル内)文。


      注意:

      モデルにINCLUDE文が含まれる場合、DIMENSION文を含めることはできません。ただし、INCLUDE文で参照されているモデルまたは階層のルート・モデルには、親モデルで必要なDIMENSION文が含まれている必要があります。

  2. 1つ以上のSETコマンドまたは「モデルでの方程式のルール」に従って記述した方程式。


    参照:

    Oracle OLAPによるモデルの方程式の処理方法については、「ディメンション・ステータスおよびモデル方程式」を参照してください。

  3. 最後に、モデルの仕様の終わりを示すEND文(OLAP Worksheetの「編集」ウィンドウで仕様をコーディングする場合は不要)。

モデルの最大行数は、4,000行です。

集計仕様におけるMODEL文

aggmapで特別なMODEL文を使用し、事前定義したモデルを実行できます(詳細は、AGGMAPコマンドのMODEL(集計内)文を参照)。

変数のデータの計算方法

モデル・オブジェクトおよびaggmapオブジェクトは、どちらもディメンション・メンバー間の関係に基づいて変数のデータ値を計算します。ディメンション・メンバー間に親子関係が存在し(つまり、ディメンションに階層構造があり)、すべての集計値を同じ方法で計算できる場合は、集計仕様でRELATION文を使用して値を計算できます。しかし、ディメンションが階層ではなく、値の計算に異なる方程式を必要とする場合は、モデルを定義する必要があります。MODEL(集計内)を使用して集計仕様でモデルを実行するか、「モデルの実行」に示されている構文を使用してコマンドラインでモデルを実行できます。

モデルの仕様の削除

モデルの定義を削除せずに、モデルの仕様を削除できます。CONSIDER文で、モデルを現行の定義として指定します。その後、MODEL文を発行し、モデルの仕様にENDを入力します。

例10-56 プログラムに指定されたモデル

次の例では、myprogというプログラムに単純なモデルを作成(または上書き)します。プログラムの最初の行で、モデルを定義または現行の定義として指定します。2番目の行には、モデルの行を指定するMODEL文が含まれています。

このモデルは、予算の明細項目を計算します。モデル方程式は、lineディメンションを基礎としています。

DEFINE myprog PROGRAM
PROGRAM
IF NOT EXISTS('myModel')
  THEN DEFINE myModel
  ELSE CONSIDER myModel
MODEL JOINLINES(-
  'DIMENSION line month' -
  'Opr.Income = Gross.Margin - Marketing' -
  'Gross.Margin = Revenue - Cogs' -
  'Revenue = LAG(Revenue, 1, month) * 1.02' -
  'Cogs = LAG(Cogs, 1, MONTH) * 1.01' -
  'Marketing = LAG(Opr.Income, 1, month) * 0.20' -
  'END')
END

例10-57 入力ファイルを基にしたモデル

この例は、前の例と同じ単純なモデルのテキストを示すものですが、ここでは、モデルはbudget.txtというASCIIディスク・ファイルに格納されています。

DEFINE income.budget MODEL
MODEL
DIMENSION line month
Opr.Income = Gross.Margin - Marketing
Gross.Margin = Revenue - Cogs
Revenue = LAG(Revenue, 1, month) * 1.02
Cogs = LAG(Cogs, 1, month) * 1.01
Marketing = LAG(Opr.Income, 1, month) * 0.20
END

income.budgetモデルをアナリティック・ワークスペースに含めるには、次の文を実行します。このとき、myinpfilesはディレクトリ・オブジェクトです。

INFILE 'myinpfiles/budget.txt'

例10-58 モデルの作成

損益計算書の明細項目を計算するincome.calcというモデルを定義するとします。

define income.calc model
ld Calculate line items in income statement

モデルを定義した後、MODEL文またはOLAP Worksheetエディタを使用して、モデルの仕様を入力します。モデルの仕様には、DIMENSIONコマンド、代入文およびコメントを含めることができます。すべてのDIMENSIONコマンドは、最初の方程式の前に配置する必要があります。この例では、次のモデル内に示されている行を指定します。

DEFINE INCOME.CALC MODEL
LD Calculate line items in income statement
MODEL
DIMENSION line
net.income = opr.income - taxes
opr.income = gross.margin - (marketing + selling + r.d)
gross.margin = revenue - cogs
END

モデルに方程式を記述する際は、任意の順序で配置できます。COMPILE文を発行するかモデルを実行してモデルをコンパイルする時点で、モデル方程式の解決順序が決定されます。1つの方程式の計算結果が別の方程式への入力データとして使用される場合、方程式は要求される順序で解決されます。

income.calcモデルを実行して、actualをソリューション変数として使用するには、次の文を実行します。

income.calc actual

ソリューション変数にモデル方程式が基礎とするディメンション以外のディメンションがある場合は、それらの各ディメンションの現行のステータス・リストに対して自動でループ処理が実行されます。たとえば、actuallineによってディメンション化されているのと同じように、monthdivisionによってディメンション化されているとします。divisionALLに制限され、monthOCT96からDEC96までに制限されている場合、各部門のステータスにある3か月についてincome.calcモデルが解決されます。

例10-59 シナリオ・モデルの作成

たとえば、各部門の楽観的な収入額、悲観的な収入額および最良予測の収入額に基づいて収益額を計算するとします。次の例で、このシナリオ・モデルを作成する手順を説明します。

シナリオ・ディメンションscenarioをコールして、計算するシナリオの値を指定します。

次のコマンドで、scenarioに値optimisticpessimisticおよびbestguessを指定します。

DEFINE scenario DIMENSION TEXT
LD Names of scenarios
MAINTAIN scenario ADD optimistic pessimistic bestguess

次のコマンドで、scenarioディメンションとは別に、他の3つのディメンション(monthlineおよびdivision)でディメンション化されるplanという変数を作成します。

DEFINE plan DECIMAL <month line division scenario>
LD Scenarios for financials

たとえば、収入や売上原価などの入力データをplan変数に入力する必要があるとします。

最良予測のデータの場合、budget変数のデータを使用できます。lineディメンションを入力明細項目に制限し、budgetデータをplan変数にコピーします。

LIMIT scenario TO 'BESTGUESS'
LIMIT line TO 'REVENUE' 'COGS' 'MARKETING' 'SELLING' 'R.D'
plan = budget

楽観的なデータと悲観的なデータは、最良予測のデータに基づいて設定する場合があります。たとえば、楽観的なデータを最良予測のデータより15%高く設定し、悲観的なデータを最良予測のデータより12%低く設定するなどです。この場合、lineを入力明細項目に制限したまま、次のコマンドを実行します。

plan(scenario 'OPTIMISTIC') = 1.15 * plan(scenario 'BESTGUESS')
plan(scenario 'PESSIMISTIC') = .88 * plan(scenario 'BESTGUESS')

最後に、入力データに基づいて結果を計算するモデルを記述してシナリオ・モデルを作成します。モデルには、この章の前述の項で示したbudget.calcモデルの計算と非常に似ている計算が含まれる可能性があります。

各シナリオには、同じ方程式を使用することも、異なる方程式を使用することもできます。たとえば、売上原価を計算する場合、各シナリオの計算で異なる定数要素を使用するとします。各シナリオで異なる定数要素を使用するには、scenarioでディメンション化した変数を定義し、変数に適切な値を指定します。変数の名前がcogsvalであるとすると、モデルにcogs明細項目を計算するための次の方程式を含めることができます。

cogs = cogsval * revenue

scenarioでディメンション化した変数を使用することで、シナリオ・モデルの柔軟性を大幅に向上できます。

同様に、各部門ごとに異なる定数要素を使用することもあります。この場合、divisionでディメンション化した変数を定義し、各ディメンションの値を保持できます。たとえば、部門によって人件費が異なる場合、cogsvalscenarioのみでなくdivisionでもディメンション化します。

モデルを実行する際、ソリューション変数としてplanを指定します。たとえば、scenario.calcというモデルの場合、次の文でモデルを解決します。

scenario.calc plan

planの各ディメンションの現行のステータス・リストに対して自動でループ処理が実行されます。したがって、scenario.calcモデルの実行時にscenarioディメンションがALLに制限されている場合、optimisticpessimisticbestguessの3つのシナリオすべてに対してモデルが解決されます。


DIMENSION(モデル内)

モデルの先頭のDIMENSION文は、モデルがデータを代入する1つ以上のディメンションの名前、またはディメンションベースの方程式で参照する1つ以上のディメンションの名前を指定します。ディメンションベースの方程式は、1つ以上のディメンション値によって表されるターゲットに計算の結果を代入します。

構文

DIMENSION dimension1 [, dimensionN]

引数

dimension

モデル方程式が基礎とする、コンポジットのベース・ディメンションを含む1つ以上のディメンション。サロゲートの作成元のディメンションのかわりに、ディメンション・サロゲートの名前を指定できます。その後、ディメンションの値のかわりにサロゲートの値を使用できます。

注意

モデルのディメンションベースの方程式

方程式(SET)がデータをディメンション値に代入するか計算でディメンション値を参照する場合、その方程式はディメンションベースの方程式と呼ばれます。ディメンションベースの方程式は、ディメンション自体を参照する必要はなく、ディメンションの値のみを参照することに注意してください。したがって、モデルにディメンションベースの方程式が含まれる場合、モデルの先頭のDIMENSION文でこれらの各ディメンションの名前を指定する必要があります。Oracle OLAPでは、この指定によって、各ディメンション値がどのディメンションに属しているかを判定します。サロゲートの作成元のディメンションのかわりに、ディメンション・サロゲートの名前を指定できます。その後、ディメンションの値のかわりにサロゲートの値を使用できます。

また、モデルがディメンションベース方程式を含む場合は、モデルの実行時にソリューション変数の名前を指定する必要があります。ソリューション変数は、モデルのデータのソースであるとともにターゲットでもあります。ディメンションベースの方程式で使用する入力データはソリューション変数が保持しており、また、計算結果はソリューション変数の指定された値に格納されます。通常、ソリューション変数は、モデル方程式が基礎とするすべてのディメンションによってディメンション化されています。たとえば、財務アプリケーションにおいて、モデルがlineディメンションを基礎とし、ソリューション変数actualがそのディメンションの1つとしてlineを持つ場合などです。

ディメンションベースの方程式によって、モデリングには柔軟性があります。モデルを解決するまでモデリング変数を指定する必要がないため、同じモデルを異なるソリューション変数で実行できます。たとえば、同じモデルを、実績額(actual)の変数、最良ケース予算額の変数および最悪ケース予算額の変数で実行することもできます。

ディメンションベースの方程式が、計算で使用するデータのソースまたは結果を代入するターゲットとしてディメンション値を参照する場合は、ディメンションをDIMENSION文に指定する必要があります。次の例では、Gross.MarginRevenueおよびCogslineディメンションの値であり、そのため、DIMENSION文にlineが指定されています。

DIMENSION line
Gross.Margin = Revenue - Cogs

ディメンションがファンクション引数の場合

ディメンションが、データソースとしてディメンション値を使用するファンクションに対する引数の場合は、そのディメンションもDIMENSION文に指定する必要があります。次の例では、monthをDIMENSION文に指定する必要があります。

DIMENSION line, month
Revenue = lag(Revenue, 1, month) * 1.05

前述のモデルの作成者は、lineおよびmonthによってディメンション化されたソリューション変数の使用を想定しています。そのため、モデルの実行時に、指定した時間ディメンション(month)をディメンションの1つとして持つソリューション変数について、LAGファンクションが操作を行います。ただし、モデル・コンパイラではソリューション変数の時間ディメンションを予想できないため、DIMENSION文でそれを指定する必要があります。DIMENSION文にmonthを含めない場合、モデルのコンパイルを試行した際にエラーが発生します。

時系列のデータを操作するファンクション(MOVINGTOTALまたはLAGなど)では、ディメンションがDAY、WEEK、MONTH、QUARTER、YEAR型の場合、dimension引数はオプションです。たとえば、前述の例では、LAGファンクションの指定でmonthを省略できます。ただし、その場合でも、DIMENSION文には適切な時間ディメンションを指定する必要があります。

ソリューション変数

ディメンションベースの方程式を含むモデルを実行する場合、モデルのデータのソースであり、ターゲットでもある、ソリューション変数を指定します。通常、ソリューション変数は、モデルで使用するDIMENSIONコマンドにリストされたすべてのディメンションによってディメンション化されています。または、ソリューション変数がコンポジットでディメンション化されている場合は、DIMENSIONコマンドによってコンポジットのベース・ディメンションがリストされます。DIMENSIONコマンドはモデルで明示的に指定するか、含まれるモデルから継承できます。「INCLUDEとの非互換性」を参照してください。

コンポジットでの処理

ディメンション・リストにあるコンポジットのソリューション変数を使用してモデルを実行する必要がある場合は、DIMENSION文にコンポジットのベース・ディメンションを指定します。モデル方程式は、結果をベース・ディメンションの値に代入します。コンポジットで必要になる新しい値は、Oracle OLAPによって自動で作成されます。

複数のDIMENSIONコマンド

ディメンションベースの方程式で参照または使用されている各ディメンションについて、それぞれ別個のDIMENSION文を指定するか、単一のDIMENSION文にすべてのディメンションを指定できます。

コマンドの位置

すべてのDIMENSIONコマンドは、モデルの先頭で指定し、方程式より前の位置に指定する必要があります。

INCLUDEとの非互換性

モデルにINCLUDE文が含まれる場合、DIMENSIONコマンドを含めることはできません。INCLUDE文は、現行のモデルに別のモデルを含めることを指定する文です。この場合、現行のモデルは、含められたモデルからそのDIMENSIONコマンド(存在する場合)を継承します。モデルを含める際の詳細は、MODELコマンドのINCLUDE文を参照してください。

継承されたDIMENSIONコマンドは、明示的なDIMENSIONコマンドに対し規定されているすべての要件を満たす必要があります。「モデルにおけるDIMENSION文作成のガイドライン」を参照してください。

ディメンションの順序

モデルでDIMENSIONコマンドに複数のディメンションを指定する場合、ディメンションをリストする順序は重要です。

モデルにおけるDIMENSION文作成のガイドライン

DIMENSION文を作成する場合、次の点に注意してください。

例10-60 予算予測のための単純なモデル

次の文では、損益計算書の項目についての予算額を予測する単純なモデルを定義します。

DEFINE income.budget MODEL
LD Model for estimating budget line items
MODEL
dimension line, month
Revenue = 1.05 * LAG(Revenue 1 month)
Gross.Margin = Revenue - Cogs
Opr.Income = Gross.Margin - (Marketing + Selling + R.D)
Net.Income = Opr.Income - Taxes
END

モデル方程式はlineディメンションを基礎とするため、DIMENSION文にはlineが指定されています。ディメンションmonthは、REVENUE値に対し操作を行うLAGファンクション内の時間ディメンションであるため、DIMENSION文にはmonthも指定されています。

モデルを実行すると、monthディメンションの現行のステータスにある値がループ処理されます。


INCLUDE

INCLUDE文は、あるモデルを別のモデルに含める文です。INCLUDE文はモデル内でのみ使用できます。

INCLUDEを使用すると、複数のモデルで共通する方程式を配置して、別個のモデルにモジュール・モデルを作成し、必要に応じてそのモデルを他のモデルに含めることができます。さらに、INCLUDE文によりwhat-if分析が容易になります。実験的なモデルでは、ベース・モデルから方程式を流用し、それを選択的に新しい方程式に置き換えることが可能です。

構文

INCLUDE model

引数

model

現行のモデルに含めるモデルの名前。現行のモデルは親モデルと呼ばれます。含めるモデルはベース・モデルと呼ばれます。

注意

モデルにおけるINCLUDE文コード化のガイドライン

モデルでINCLUDE文を使用するには、次のガイドラインに従ってください。

モデルのネスト方法

INCLUDE文をベース・モデルで使用することにより、モデルをネストできます。たとえば、モデルmyModel1myModel2モデルを含み、モデルmyModel2がモデルmyModel3を含むことが可能です。ネストしたモデルは階層形式になります。この例では、myModel1が一番上の階層になり、myModel3がルートになります。ベース・モデルは、階層内でそれより上位にあるモデルを含むことができません。前述の例では、myModel2myModel1を含むことができず、myModel3myModel1またはmyModel2を含むことができません。

方程式間の依存関係

INCLUDE文を含むモデルをコンパイルする場合、コンパイラは、方程式を順序付けたりブロックに構成したりする際に、含まれているすべてのモデルにある方程式間の依存関係を考慮します。したがって、MODEL.COMPRPTプログラムを実行してコンパイルの結果を確認する、または親モデルの実行前にMODTRACEオプションをYESに設定すると、含まれているモデルの階層の異なるレベルの方程式が散在している場合があります。例10-62「コンパイル・レポートの生成」を参照してください。

含まれているモデルの方程式間に依存関係が見つからない場合、コンパイラはルート・モデルの方程式を最初に実行し、親モデル内の方程式を最後に実行します。

親モデルのコンパイル

親モデルをコンパイルすると、コンパイル済コードがまだ存在していない場合、コンパイラによって、含まれている階層でその親モデルの下にあるすべてのベース・モデルがコンパイルされます。特定のモデルでエラーが検出されると、そのモデルおよび階層でそれより上にあるモデルはコンパイルされません。階層のルート・モデルにエラーがあると、上位のモデルはルート・モデルからDIMENSION文を継承できません。この場合、エラーの実際の発生箇所がルート・モデルでも、コンパイラは親モデルにおけるエラーとしてレポートすることがあります。たとえば、アタッチしたアナリティック・ワークスペースにターゲット・ディメンション値が存在しないとして、コンパイラによってレポートされる可能性があります。一方、コンパイラが親モデル内でエラーを検出し、そこに含まれているモデル内にはエラーが見つからない場合、親モデルがコンパイルされなくても、含まれているモデルはコンパイルされます。

方程式のマスク

what-if分析をサポートするために、モデルの方程式で前の方程式をマスクできます。以前の方程式は、同じモデルまたはそれに含まれているモデルにあります。マスクされた方程式は実行されません。モデルのコンパイル後にMODEL.COMPRPTプログラムを実行すると、マスクされた方程式は、コンパイルしたモデルについてのレポートには表示されていないことがわかります。

ある方程式が、前の方程式のターゲットでもある変数またはディメンション値に値を代入する場合、マスクを実行できます。マスクのルールは次のとおりです。

例10-61 モデルを含むモデル

この例は、base.linesというベース・モデルを含むincome.planという親モデルを示しています。

DEFINE income.plan MODEL
MODEL
INCLUDE base.lines
revenue = LAG(revenue, 1, month) * 1.02
cogs = LAG(cogs, 1, month) * 1.01
taxes = 0.3 * opr.income
END

DEFINE BASE.LINES MODEL
MODEL
DIMENSION line month
net.income = opr.income - taxes
opr.income = gross.margin - marketing
gross.margin = revenue - cogs
END

例10-62 コンパイル・レポートの生成

次の文を使用して、親モデルをコンパイルし、コンパイル・レポートを生成します。

COMPILE income.plan
MODEL.COMPRPT income.plan

これらの文によって生成される出力は次のとおりです。

MODEL INCOME.PLAN <LINE MONTH>
                      BLOCK 1 (SIMPLE)
INCOME.PLAN     2:    revenue = lag(revenue, 1, month) * 1.02
INCOME.PLAN     3:    cogs = lag(cogs, 1, month) * 1.01
BASE.LINES      4:    gross.margin = revenue - cogs
BASE.LINES      3:    opr.income = gross.margin - marketing
INCOME.PLAN     4:    taxes = 0.3 * opr.income
BASE.LINES      2:    net.income = opr.income - taxes
                      END BLOCK 1