Filter
EssbaseのMDX Filter関数は、検索条件の値がTRUEであるセットのタプルを返します。返されるセット内のタプルの順序は、入力セットと同じです。
構文
FILTER ( set, search_condition )
パラメータ
- set
-
重複に使用するセット。
- search_condition
-
ブール式(「MDX文法ルール」を参照)。検索条件は、セット内のそれぞれのタプルのコンテキストで評価されます。
例1
次のフィルタ処理しない問合せは、すべてのレベル0製品の利益を返します:
SELECT
{ [Profit] }
ON COLUMNS,
[Product].levels(0).members
ON ROWS
FROM Sample.Basic
この問合せが返すグリッドは次のとおりです。
表4-64 MDX例からの出力グリッド
(軸) | Profit |
---|---|
100-10 | 22777 |
100-20 | 5708 |
100-30 | 1983 |
200-10 | 7201 |
200-20 | 12025 |
200-30 | 4636 |
200-40 | 4092 |
300-10 | 12195 |
300-20 | 2511 |
300-30 | 11093 |
400-10 | 11844 |
400-20 | 9851 |
400-30 | -394 |
100-20 | 5708 |
200-20 | 12025 |
300-30 | 11093 |
前述の結果をフィルタリングして負のProfitのみを含めるには、Filter関数を使用して、この関数に元のセットと検索条件を渡します。フィルタは、検索条件が真である(Profitがゼロ未満)メンバーのセットのみを返します。
SELECT
{ Profit }
ON COLUMNS,
Filter( [Product].levels(0).members, Profit < 0)
ON ROWS
FROM Sample.Basic
結果の問合せは、負の利益を持つ製品のみを返します。
表4-65 MDX例からの出力グリッド
(軸) | Profit |
---|---|
400-30 | -394 |
例2
例1の検索式は、値式(Profit)を値と比較しました。メンバー属性を検索条件として使用してフィルタリングすることもできます。たとえば、Filter関数を使用して、Caffeinated属性がTRUEであるメンバーのみを選択できます。
SELECT
{ [Profit] }
ON COLUMNS,
Filter( [Product].levels(0).members, Product.CurrentMember.[Caffeinated])
ON ROWS
FROM Sample.Basic
この問合せは、カフェイン入りのメンバーの利益を返します。
表4-66 MDX例からの出力グリッド
(軸) | Profit |
---|---|
100-10 | 22777 |
100-20 | 5708 |
200-10 | 7201 |
200-20 | 12025 |
300-10 | 12195 |
300-20 | 2511 |
300-30 | 11093 |
検索条件Product.CurrentMember.[Caffeinated]
を理解するには、右から左に読むとわかりやすい場合があります。Filterは、現在のメンバーにCaffeinatedプロパティが存在するかどうかを検索しています。このとき、入力セット内の各メンバーについて検索し、Productディメンションから開始されます(CurrentMember関数では、引数としてディメンション名が必要です)。
フィルタは反復関数です。つまり、フィルタが入力セット全体をループして各タプルの検索条件を評価し終わるまで、評価対象のセット内のすべてのメンバーまたはタプルで、演算対象のそのメンバーが"現在のメンバー"です。したがって、以前の問合せ結果がどのように生成されたかを確認するには、まず、実際にtrueに設定されたCaffeinated属性を持つのはどのメンバーであるかを確認することが役立ちます。次のフィルタ処理しない問合せは、計算されたメンバーを使用して、レベル0の製品メンバーのうち、カフェイン入りのメンバーを明らかにします。IIF関数は、Caffeinated属性がTRUEに設定されているメンバーごとに値1を返し、それ以外の場合は値0を返します。
WITH MEMBER Measures.IsCaffeinated
AS 'IIF(Product.CurrentMember.[Caffeinated], 1, 0)'
SELECT
{ IsCaffeinated }
ON COLUMNS,
[Product].levels(0).members
ON ROWS
FROM Sample.Basic
この問合せが返すグリッドは次のとおりです。
表4-67 MDX例からの出力グリッド
(軸) | IsCaffeinated |
---|---|
100-10 | 1 |
100-20 | 1 |
100-30 | 0 |
200-10 | 1 |
200-20 | 1 |
200-30 | 0 |
200-40 | 0 |
300-10 | 1 |
300-20 | 1 |
300-30 | 1 |
400-10 | 0 |
400-20 | 0 |
400-30 | 0 |
100-20 | 0 |
200-20 | 0 |
300–30 | 0 |
検索条件は、入力セット内のタプルごとに評価され、検索条件を満たすタプルのみが返されることに注意してください。
例3
例2では、CurrentMember関数が導入されています。CurrentMemberが明示的に呼び出されていない場合でも、Filterは、セットを反復処理する間、"現在のメンバー"のコンテキストで動作します。Filterやその他の反復関数は、ネストされたコンテキストで処理されます。
デフォルトでは、Filterは最上位ディメンション・メンバーの現在のメンバー・コンテキストで動作します。組込みの最上位のディメンション・コンテキストよりも優先されるスライサ(Where句)を使用して、MDXコンテキストを小さくします。さらに、Filterの検索条件引数でコンテキストを指定することによって、スライサ・コンテキストよりも優先されることができます。
次の問合せは、Qtr1のWestern RegionのProfit値を返します。MDXコンテキストはWest、Qtr1であることに注意してください:
SELECT
{ [Profit] }
ON COLUMNS,
[Product].levels(0).members
ON ROWS
FROM Sample.Basic
Where (West, Qtr1)
前述の問合せにフィルタを追加しても、Filterのサブコンテキストはメイン・コンテキストに基づくため、Profitの値は(Profit, West, Qtr1)
として評価されます:
SELECT
{ [Profit] }
ON COLUMNS,
Filter( [Product].levels(0).members, Profit < 0)
ON ROWS
FROM Sample.Basic
Where (West, Qtr1)
次の問合せでは、Profitの値は(Profit, West, Qtr1)
として評価されます。これは、外部コンテキストが(Profit, Market, Qtr1)
であっても変わりありません。これは、Filter関数の内部コンテキストが、スライサの外部コンテキストよりも優先されるためです(WestがMarketを置き換えます):
SELECT
{ [Sales] }
ON COLUMNS,
Filter( [Product].levels(0).members, (Profit, West) < 0)
ON ROWS
FROM Sample.Basic
Where (Market, Qtr1)
前述の問合せは、West、Qtr1のProfitが0未満であるProductのメンバーのWest、Qtr1のSales値を返します:
表4-68 MDX例からの出力グリッド
(軸) | Sales |
---|---|
100-20 | 7276 |
400-30 | 3763 |
100-20 | 7276 |
その他の例
Sample Basicに関する次の問合せは、Qtr1以降に売上が少なくとも10%増加した製品のQtr2売上高を返します:
SELECT
{
Filter (
[Product].Members,
[Measures].[Sales] >
1.1 *
( [Measures].[Sales], [Year].CurrentMember.PrevMember )
)
}
on columns
FROM sample.basic
WHERE ([Year].[Qtr2], [Measures].[Sales])
前述の問合せは、次の結果を返します:
表4-69 MDX例からの出力グリッド
Cola | Dark Cream |
---|---|
16048 | 11993 |
Sample Basicに関する次の問合せは、その製品ファミリの月間売上高が8,570を超える製品ファミリ"100"の売上高を返します。フィルタリング論理は、WITHセクションに名前付きセットとして格納されます:
WITH SET [High-Sales Months] as
'
Filter(
[Year].Levels(0).members,
[Measures].[Sales] > 8570
)
'
SELECT
{[Measures].[Sales]}
ON COLUMNS,
{[High-Sales Months]}
ON ROWS
FROM
sample.basic
WHERE
([Product].[100])
前述の問合せは、次の結果を返します:
表4-70 MDX例からの出力グリッド
(軸) | Sales |
---|---|
Apr | 8685 |
May | 8945 |
Jun | 9557 |
Jul | 9913 |
Aug | 9787 |
Sep | 8844 |
Dec | 8772 |