Notification Services の MDX クエリ
多次元式 (MDX) クエリの結果セットには、複数のディメンションがある場合があります。しかし、このイベント プロバイダの MDX クエリでは、結果をイベント セットとして Notification Services アプリケーションに送信できるように、フラットな行セットを返す必要があります。
MDX クエリが返す結果セットには、イベント クラス フィールドにマップされる列が含まれている必要があります。MDX の結果の最初の列は最初のイベント クラス フィールドに、2 番目の結果列は 2 番目のイベント クラス フィールドに、という形でマップされる必要があります。
Analysis Services イベント プロバイダの MDX クエリは、静的であってもかまいません。静的とは、アプリケーションの作成時に完全なクエリがわかっていることを意味します。また、MDX クエリは、動的であってもかまいません。動的とは、Transact-SQL クエリを実行することによって、ROWS 軸の要素または MDX クエリ スライサの要素が取得されることを意味します。Transact-SQL クエリの結果は、XSL 変換を使用して最終的な MDX クエリを生成するために使用されます。
静的な MDX クエリ
Notification Services アプリケーションのデータを取得するために必要な正確なクエリがわかっている場合は、静的なクエリを作成できます。この正確なクエリは、アプリケーション定義で指定するクォンタム スケジュールに従って、Notification Services によって実行されます。
たとえば、次のようなイベント クラス定義があったとします。
<EventClass>
<EventClassName>KPIEvents</EventClassName>
<Schema>
<Field>
<FieldName>Employee</FieldName>
<FieldType>varchar(100)</FieldType>
</Field>
<Field>
<FieldName>ProfitMargin</FieldName>
<FieldType>varchar(10)</FieldType>
</Field>
<Field>
<FieldName>OrderQuantity</FieldName>
<FieldType>int</FieldType>
</Field>
<Field>
<FieldName>SalesAmount</FieldName>
<FieldType>money</FieldType>
</Field>
</Schema>
</EventClass>
以下は、このイベント クラスにマップされる適切な結果を返す静的な MDX クエリの一例です。
SELECT
{[Measures].[Reseller Gross Profit Margin],
[Measures].[Reseller Order Quantity],
[Measures].[Reseller Sales Amount]} ON COLUMNS,
{[Employee].[Employees].[Ken J. Snchez],
[Employee].[Employees].[Amy E. Alberts]} ON ROWS
FROM [Adventure Works]
WHERE [Date].[Calendar].[CY 2002]
このクエリは、Adventure Works キューブから 3 つのメジャーを選択します。これらのメジャーが結果セットの列です。このクエリをさらに限定して、Ken J. Sánchez と Amy E. Alberts という 2 人の従業員に関連する行のみを選択します。
Order Time ディメンションには、複数の組があります。そこで、クエリをさらに限定 (スライス) して、2002 年のデータのみを表示します。
最終的な結果セットは、選択した番号の従業員の Reseller Gross Profit Margin、Reseller Order Quantity、および Reseller Sales Amount の 2002 年の値を表示するテーブルになります。
Reseller Gross Profit Margin | Reseller Order Quantity | Reseller Sales Amount | |
---|---|---|---|
Ken J. Sánchez |
1.34% |
58,241 |
$24,144,429.65 |
Amy E. Alberts |
4.68% |
10,546 |
$3,457,549.94 |
このクエリが Notification Services によって実行されると、2 次元の結果セットがイベント バッチとしてイベント クラスに送信されます。
動的な MDX クエリ
Notification Services アプリケーションで、アプリケーションにサブスクライブしている従業員のデータのみを選択する場合もあります。しかし、従業員はサブスクリプションを追加したり削除したりできるため、アプリケーションの作成時に固定リストを使用して静的なクエリを作成することはできません。
サブスクライブしているかどうかに関係なく各従業員のレコードを返す静的クエリを作成することはできます。しかし、膨大な数の従業員がキューブに含まれている場合、静的なクエリでは従業員ごとに 1 つの行が返されることになります。これは、無関係なデータを含む巨大なイベント バッチになります。
このような場合は、動的な MDX クエリを作成することによって、アプリケーションのパフォーマンスを大幅に向上させることができます。たとえば、次のようなスキーマを使用するサブスクリプション クラスがあるとします。
<SubscriptionClass>
<SubscriptionClassName>KPISubscriptions</SubscriptionClassName>
<Schema>
<Field>
<FieldName>DeviceName</FieldName>
<FieldType>nvarchar(255)</FieldType>
<FieldTypeMods>NOT NULL</FieldTypeMods>
</Field>
<Field>
<FieldName>SubscriberLocale</FieldName>
<FieldType>nvarchar(10)</FieldType>
<FieldTypeMods>NOT NULL</FieldTypeMods>
</Field>
<Field>
<FieldName>EmployeeFullName</FieldName>
<FieldType>varchar(100)</FieldType>
</Field>
<Field>
<FieldName>ProfitMargin</FieldName>
<FieldType>varchar(10)</FieldType>
</Field>
</Schema>
...
</SubscriptionClass>
まず、従業員など、目的の項目の一覧を選択する Transact-SQL クエリを作成します。
SELECT EmployeeFullName as Employee
FROM NSKPISubscriptionsView
このクエリは、ミドルネームのイニシャルが名前 (名) に含まれていることを前提としています。
Analysis Services イベント プロバイダは、この Transact-SQL クエリの結果を XML 形式で取得します。この形式では、選択された各列の名前が行要素の属性として返されます。
<rows>
<row Employee="Ken J. Snchez" />
<row Employee="Amy E. Alberts" />
<row Employee="Terry Lee Duffy" />
<row Employee="Brian S. Welcker" />
</rows>
次に、結果の一覧を完全な MDX クエリの形式に変更する XSL 変換を記述します。たとえば、match="rows"
のクエリの既知の部分を変換に記述できます。次に、各行の値を MDX クエリの ON ROWS の指定項目に変換します。この XML を変換するには、次の XSL 変換を使用します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="rows">
SELECT
{ [Measures].[Total Product Cost],
KPIValue([Gross Profit Margin]),
KPIGoal([Gross Profit Margin]),
KPIStatus([Gross Profit Margin]),
KPITrend([Gross Profit Margin]) } ON COLUMNS,
{ <xsl:apply-templates select="row"/> } ON ROWS
FROM [Adventure Works]
WHERE [Date].[Calendar Time].[2002]
</xsl:template>
<xsl:template match="row">
<xsl:apply-templates select="@Employee" />
<xsl:if test="not(position()=last())">,
</xsl:if>
</xsl:template>
<xsl:template match="@Employee">[Employee].[Employees].[<xsl:value-of select="."/>]</xsl:template>
</xsl:stylesheet>
この変換の結果は、完全な MDX クエリになります。
SELECT
{[Measures].[Reseller Gross Profit Margin],
[Measures].[Reseller Order Quantity],
[Measures].[Reseller Sales Amount]} ON COLUMNS,
{ [Employee].[Employees].[Ken J. Snchez],
[Employee].[Employees].[Amy E. Alberts],
[Employee].[Employees].[Brian S. Welcker] } ON ROWS
FROM [Adventure Works]
WHERE [Date].[Calendar].[CY 2002]
このクエリは、Analysis Services イベント プロバイダが実行されるたびに動的に生成されます。イベント プロバイダは、このクエリを使用してキューブでイベント データのクエリを実行します。
この XSL 変換では、スライサ ([Date].[Calendar].[CY 2002]) が XSL 変換にハードコードされています。SlicerQuery 引数を使用して Transact-SQL クエリを Analysis Services イベント プロバイダに渡すと、WHERE 句を動的に作成できます。
行クエリとスライサ クエリの結果は、単一の XML 結果に結合されます。
<rows>
<row Employee="Ken J. Snchez" />
<row Employee="Amy E. Alberts" />
<row Employee="Brian S. Welcker" />
</rows>
<slicers>
<slicer Calendar="CY 2002"/>
</slicers>
この XML に XSL 変換を適用すると、動的な MDX クエリが生成されます。
参照
概念
Analysis Services イベント プロバイダの定義
その他の技術情報
Analysis Services イベント プロバイダ
イベント プロバイダの定義
標準イベント プロバイダ
MDX の主な概念 (MDX)