%FILTER 節は、必要な数だけ含めることができます。この節は、SELECT 文に付加するだけで、結果をさらにフィルタ処理できるため、プログラムでクエリを実行する場合に特に便利です (これに対して、WHERE 節を使用して別のフィルタ項目を追加する必要がある場合、許可される WHERE 節が 1 つのみであるため、WHERE 節を書き換える必要があります)。
Important:
各セット要素は別のスライサ軸として使用され、(すべての %FILTER 節の) すべてのスライサ軸の結果がいっしょに集約されます。これは軸のたたみ込みのプロセスです (フィルタはクエリ軸と見なされます)。軸のたたみ込みを実行すると、どのスライサ軸にも NULL の結果がないソース・レコードは複数回カウントされます。
軸のたたみ込みでは、キューブの定義での指定に従い、対象としているメジャーの集約メソッドに基づいて値が組み合わされます (ここの例では、%COUNT が追加されます)。
詳細は、"InterSystems Business Intelligence の実装" の付録 "Business Intelligence クエリ・エンジンの仕組み" にある "軸のたたみ込み" を参照してください。
%SQLRESTRICT
キューブに対して %SQLRESTRICT ディメンジョンを有効にしている場合、そのキューブに対する MDX クエリに SQL SELECT 文または WHERE 節を含めることができます。これにより、MDX クエリの SQL 文によって実行時の制限を有効にできます。%SQLRESTRICT ディメンジョンを使用するには、以下の構文で %FILTER 節を使用します。
%FILTER %SQLRESTRICT.&[sqlStatement]
sqlStatement は、SQL SELECT 文または SQL WHERE 節です。SELECT 文は、キューブのソース・テーブルから ID のリストを返すように設計する必要があります。これらのID により、最終的な MDX 結果で考慮されるファクトを制限します。最終的な結果には、返される ID リスト内に ID があるレコードに対応するファクトのみが含まれます。sqlStatement に SELECT 文を使用する以下の MDX クエリの例について考えてみます。
SELECT FROM HOLEFOODS
WHERE [Comments].[H1].[Comments].&[SELECT ID FROM HoleFoods.SalesTransaction WHERE ID IN (1,2,3,4)]
外部参照テーブルにクエリを実行することもできます。例えば、以下のような単純なテーブルがあるとします。
キューブ・ソース・テーブルの例
ID |
Name |
1 |
Bill |
2 |
Sally |
3 |
Tom |
4 |
Mike |
5 |
Teresa |
6 |
Alice |
外部参照テーブルの例 (Cohort.Table)
ID |
PatientID |
Name |
Age |
1 |
1 |
Bill |
1 |
2 |
6 |
Sally |
10 |
3 |
4 |
Tom |
45 |
以下の %SQLRESTRICT サブクエリは PatientID 値 1 および 6 を返し、MDX クエリに対して考えられる結果として、キューブ・ソース・テーブルの例で ID 1 と 6 を持つ Bill と Alice のみが残ります。
%SQLRESTRICT.&[SELECT PatientID From Cohort.Table WHERE Age < 35]
上のサンプル・テーブルは非常に単純化されたもので、例を示す目的でのみ使用されています。
%SQLRESTRICT サブクエリは、ソース・テーブルの ID と想定される 1 列の数値を返します。
または、WHERE 節をショートカットとして使用して、ソース・レコードの制限を直接記述することもできます。以下の例を検討します。
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[WHERE ID IN (1,2,3,5,10)]
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[WHERE Outlet = 24]
SELECT NON EMPTY [DateOfSale].[Actual].[YearSold].Members ON 1
FROM [HOLEFOODS] %FILTER %SQLRESTRICT.&[WHERE YEAR(DateOfSale)='2017']
内部的には、この WHERE 節構文は、MDX クエリでクエリされるキューブのソース・クラスをターゲットとして、システムにより SELECT 文を %SQLRESTRICT サブクエリに挿入します。例えば、Holefoods.SalesTransaction は Holefoods キューブのソース・クラスであるため、以下の 2 つのクエリは同等です。
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[SELECT ID FROM Holefoods.SalesTransaction WHERE ID IN (1,2,3,4)]
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[WHERE ID IN (1,2,3,4)]