Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

計算ディメンジョンの定義

計算ディメンジョンは強力で、メンバを実行時にクエリ経由で定義できる高度な InterSystems IRIS Business Intelligence モデル・オプションです。ここでは、これらを定義する方法を説明します。

計算ディメンジョンとその他の基本 Business Intelligence モデル要素との比較については、"InterSystems Business Intelligence のモデルの定義" の "モデル・オプションの概要" を参照してください。

Important:

計算ディメンジョンには計算メンバとの関連付けはありません。計算ディメンジョンは Business Intelligence に固有です。計算メンバは、MDX の標準的な概念です。

SQL 計算ディメンジョンの定義

SQL 計算ディメンジョンには、実行時に SQL クエリによって決定されるメンバが含まれます。メンバごとにクエリを指定します。

Note:

NULL 置換オプションは、計算ディメンジョンに影響しません。

計算ディメンジョンの例

Patients キューブには ComputedD ディメンジョンがあります。これは、2 つのメンバ (member 1 および member 2) を定義します。これらの各メンバは、特定の患者の ID を取得する SQL クエリによって定義されます。以下は、アナライザの左の領域に示すように、これらのメンバを示します。

The left side of the Analyzer, showing the ComputedD dimension, containing the Computed level and two members within.

このディメンジョン、Computed レベル、およびメンバは、キューブの他の要素を使用する場合と同様に使用できます。

同様に、HoleFoods キューブには、Comments ディメンジョンがあります。これは、2 つのメンバ Complaints および Compliments を定義します。これらのメンバは、SQL クエリによっても定義されます。

SQL 計算ディメンジョンの定義

以下の手順を使用すると、容易に SQL 計算ディメンジョンを定義できます。

  1. アーキテクトを使用して、必要な名前でディメンジョン、階層、およびレベルを追加します。

    後で変更するため、選択するディメンジョンのタイプは重要でありません。

    ソース・プロパティやソース式は指定しないでください。

    この手順では、スタジオでの編集が容易なシェルを作成します。またアーキテクトでは、便宜上、表示名を初期化して名前と同じにします。

  2. スタジオでキューブ・クラスを開きます。

  3. 計算ディメンジョンに対応する <dimension> 要素を変更します。以下のように変更します。

    • type 属性を以下のように編集します。

      type="computed"
      
    • <dimension> 要素に以下のいずれかを追加します。

      dimensionClass="SQL"
      dimensionClass="%DeepSee.ComputedDimension.SQL
      

      dimensionClass 属性は、ヘルパー・クラスを参照します。完全なパッケージおよびクラス名を指定しないと、このクラスは %DeepSee.ComputedDimension パッケージ内にあると見なされます。%DeepSee.ComputedDimension.SQLOpens in a new tab クラスは、SQL ベースの計算ディメンジョンのヘルパー・クラスです。その他のタイプの計算ディメンジョンは、このドキュメントの対象ではありません。

    以下に例を示します。

    <dimension name="New Computed Dimension" displayName="New Computed Dimension"
        disabled="false"
        hasAll="false"
        type="computed"
        dimensionClass="SQL" >
    

    既定では、このようには改行されません。この例では読みやすくするために改行が追加されています。

  4. レベルを定義するセクションを見つけます。

    <level name="New Computed Level" displayName="New Computed Level" 
        disabled="false"
        list="false"
        useDisplayValue="true">
    </level>
    
  5. </level> 行の直前で、以下のように行を追加します。

    <member name="" displayName=""  spec="" />
    

    以下のように編集します。

    属性
    name メンバ名。
    displayName このメンバのオプションの表示名。
    description アナライザの左側の領域にツールヒントとして表示するオプションのテキスト。
    spec このキューブで使用されるファクト・テーブルの 1 つ以上のレコードの ID を返す SQL SELECT クエリ。ファクト・テーブルを参照するには、トークン $$$TABLE または完全なテーブル名を使用します。ファクト・テーブルの詳細は、"InterSystems Business Intelligence のモデルの定義" の "ファクト・テーブルおよびディメンジョン・テーブルの詳細" を参照してください。"spec のバリエーション" も参照してください。

    以下に例を示します。

    member name="example member 1" displayName="member 1"          
    spec="select ID from BI_Model_PatientsCube.Fact WHERE MxAge&lt;50 AND DxHomeCity->DxHomeCity='Elm Heights'" />
    

    これらの属性で XML 予約文字を使用することはできません。置換については、"XML 予約文字" を参照してください。

  6. その他の <member> 要素を必要に応じて追加します。

    これらの要素の順序によって、対応するメンバの既定の並べ替え順序が決まります。

  7. クラスを保存し、リコンパイルします。

    これを実行するとすぐに、新しいディメンジョンとそのメンバを使用できるようになります。

サンプルの詳細

Patients キューブでは ComputedD ディメンジョンに以下のメンバが含まれています。

  • member 1 は、以下の SQL クエリによって定義されます。

    select ID from BI_Model_PatientsCube.Fact WHERE MxAge&lt;50 AND DxHomeCity->DxHomeCity='Elm Heights'
    

    このクエリは、キューブのファクト・テーブルを使用します。詳細は、"InterSystems Business Intelligence のモデルの定義" の "ファクト・テーブルおよびディメンジョン・テーブルの詳細" を参照してください。

  • member 2 は、以下の SQL クエリによって定義されます。

    select ID from $$$TABLE WHERE MxAge=40 AND DxHomeCity->DxHomeCity='Juniper'
    

    このクエリは $$$TABLE を使用します。これはファクト・テーブルの実際の名前に置き換えられます。前のクエリとは異なり、このクエリは $$$TABLE トークンを変換するための情報がないため、管理ポータルでは有効ではありません。

以下のピボット・テーブルに、これらのメンバが示されています。

A pivot table with the two members of the Computed level in the rows and columns for Avg Age and Patient Count.

例えば、この例の member 1 は、平均年齢 24.50 歳の 801 人の患者で構成されています。

spec のバリエーション

可能な spec のバリエーションは以下のとおりです。

  • キューブのベース・クラスにクエリに適したインデックスがある場合は、代わりにそのクラスをクエリで参照することもできます。このクラスの ID は、ファクト・テーブルで使用される ID と同じです。

    これは、頻繁に変更されるグループを反映するディメンジョンが必要な場合やキューブの再構築や同期化を回避したい場合に役立ちます。

  • 省略表現として、SELECT 文の代わりに WHERE 節を使用することができます。この場合は、WHERE 節を使用する SELECT 文が生成されます。この文では、ファクト・テーブルから ID を選択します。

    例は、このセクションで後述する計算ディメンジョンの例の By Industry レベルのメンバを参照してください。

  • 省略表現として、トークン $$$FACT を使用してファクト・テーブル内のフィールドを参照できます。そのためには、レベルで、factName 属性にそのフィールドの名前を指定します。以下に例を示します。

    <level name="By Allergy Count" factName="Mx1968652733I" >
    

    次に、SELECT 文 (または WHERE 節) で、$$$FACT を使用してこのフィールドを参照します。このトークンが適切に解析されるように、トークンの前後に必ずスペースを挿入してください。

    例は、このセクションで後述する計算ディメンジョンの例の By Allergy Count レベルのメンバを参照してください。

  • SELECT 文または WHERE 節を使用する代わりに、ストアド・プロシージャを呼び出す CALL 文を使用できます。以下に例を示します。

    spec="CALL MyStoredProcedure()"
    

    ストアド・プロシージャでは、メソッド・キーワード SqlProc およびReturnResultsets の両方を必ず True に指定してください。以下に例を示します。

    ClassMethod GetPatientIsDiabetic() As %Integer [ ReturnResultsets, SqlProc ]
    {
        // Note that %sqlcontext is created when SQLPROC is defined    
        Try {
            Set rc = 1
            
            Set sql = "SELECT f.id id FROM HSAA_PatientCurrentConditionsCube.Fact f, HSAA.Diagnosis d "
                     _" WHERE d.Patient = f.%sourceid and d.Diagnosisgroup in ('249', '250', '253')"
            Set st = ##class(%SQL.Statement).%New()
            Set sc = st.%Prepare(sql)
            If ($$$ISERR(sc)) {
                    Set rc = 0
                    Quit
            }
            Set rs = st.%Execute()
            Do %sqlcontext.AddResultSet(rs)
        }
        Catch(ex) {
            Set %sqlcontext.%SQLCODE = ex.AsSQLCODE()
            Set %sqlcontext.%Message = ex.SQLMessageString()
            Set rc = 0
        }
        
        Quit rc
    } 
    

以下の計算ディメンジョンは、Patients キューブで機能します。これを使用するには、コピーしてキューブ・クラスに貼り付け、そのキューブ・クラスをリコンパイルします。

<dimension name="Other Groups" displayName="Groups (Computed Dimension)" 
 hasAll="false" type="computed" dimensionClass="SQL">
  <hierarchy name="H1">
   <level name="By Industry"  >
    <member name="Retail Trade" 
    spec="WHERE DxIndustry->DxIndustry='Retail Trade'">
    </member>
    <member name="Finance and Insurance" 
    spec="select ID from $$$TABLE WHERE DxIndustry->DxIndustry='Finance and Insurance'">
    </member>
   </level>
  </hierarchy>
  <hierarchy name="H2">
   <level name="By Allergy Count" factName="Mx1968652733I" >
    <member name="Highly allergic"
    spec="WHERE $$$FACT > 2">
    </member>
    <member name="Not allergic" 
    spec="select ID from $$$TABLE WHERE $$$FACT = 0">
    </member>
   </level>
  </hierarchy>
</dimension>

MDX 計算ディメンジョンの定義

MDX 計算ディメンジョンには、実行時にMDX クエリによって決定されるメンバが含まれます。メンバごとにクエリを指定します。

Note:

NULL 置換オプションは、計算ディメンジョンに影響しません。

MDX 計算ディメンジョンの定義

以下の手順を使用すると、容易に MDX 計算ディメンジョンを定義できます。

  1. アーキテクトを使用して、必要な名前でディメンジョン、階層、およびレベルを追加します。

    後で変更するため、選択するディメンジョンのタイプは重要でありません。

    ソース・プロパティやソース式は指定しないでください。

    この手順では、スタジオでの編集が容易なシェルを作成します。またアーキテクトでは、便宜上、表示名を初期化して名前と同じにします。

  2. スタジオでキューブ・クラスを開きます。

  3. 計算ディメンジョンに対応する <dimension> 要素を変更します。以下のように変更します。

    • type 属性を以下のように編集します。

      type="computed"
      
    • 以下を <dimension> 要素に追加します。

      dimensionClass="MDX"
      

      dimensionClass 属性は、ヘルパー・クラスを参照します。完全なパッケージおよびクラス名を指定しないと、このクラスは %DeepSee.ComputedDimension パッケージ内にあると見なされます。

    以下に例を示します。

    <dimension name="AgeBuckets" type="computed" dimensionClass="MDX">
        <hierarchy name="H1">
           <level name="Years"/>
        </hierarchy>
    </dimension>
    
  4. 以下のいずれかの方法でメンバを定義します。

    • 以下の例のように、<level> の子として <member> 要素を追加します。

      <member name="Boston" spec="[OUTLET].[CITY].[BOSTON]"/>
      

      <member> 要素を配置する場所の例については、"SQL 計算ディメンジョンの定義" を参照してください。

    • キューブ・クラスの %OnGetComputedMembers() コールバックを定義します。次のサブセクションを参照してください。

  5. キューブ・クラスを保存してリコンパイルします。

    これを実行するとすぐに、新しいディメンジョンとそのメンバを使用できるようになります。

%OnGetComputedMembers()

%OnGetComputedMembers() コールバックには、以下のシグニチャがあります。

ClassMethod %OnGetComputedMembers(pDimName As %String, 
                                  pHierName As %String, 
                                  pLevelName As %String, 
                                  ByRef pMemberList, 
                                  pRollupKey As %String = "", 
                                  ByRef pRange As %String = "") As %Status

pDimNamepHierName、および pLevelName はそれぞれ、ディメンジョン、階層、およびレベルの名前です。このメソッドは参照により pMemberList を返します。これは、以下の形式の多次元配列です。

配列ノード 配列値
pMemberList(i)。I は整数です。 指定レベルのメンバを定義する $LISTBUILD リスト。このリストには、以下の項目が以下の順序で含まれている必要があります。
  • メンバを定義する MDX 式

  • メンバの表示名

  • メンバのキー

以下に例を示します。

ClassMethod %OnGetComputedMembers(pDimName As %String, pHierName As %String, pLevelName As %String, 
      ByRef pMemberList, pRollupKey As %String = "", ByRef pRange As %String = "") As %Status
{
    If (pDimName="AgeBuckets") {
        If (pLevelName="Years") {
            // $LB(MDX,Name,Key)
            Set pMemberList($I(pMemberList)) = 
              $LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-1y-1d]:[NOW])","1 year(s)","1")
            Set pMemberList($I(pMemberList)) = 
              $LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-2y-1d]:[NOW-1y])","2 year(s)","2")
            Set pMemberList($I(pMemberList)) = 
              $LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-3y-1d]:[NOW-2y])","3 year(s)","3")
            Set pMemberList($I(pMemberList)) = 
              $LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-4y-1d]:[NOW-3y])","4 year(s)","4")
            Set pMemberList($I(pMemberList)) = 
              $LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-5y-1d]:[NOW-4y])","5 year(s)","5")
            Set pMemberList($I(pMemberList)) = 
              $LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-6y-1d]:[NOW-5y])","6 year(s)","6")
            Set pMemberList($I(pMemberList)) = 
              $LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-7y-1d]:[NOW-6y])","7 year(s)","7")
        }
    }
    Quit $$$OK
}
FeedbackOpens in a new tab