4 クエリの作成
4.9 クエリ内のデータのフィルタ処理
4.9.3 サブフィルタを使用したデータのフィルタ処理
4.9.3.1 定義済みのサブクエリ
サブクエリはより柔軟なクエリフィルタで、通常のクエリフィルタで実行できるよりも高度な方法で値を制限することができま す。
サブクエリが通常のクエリフィルタよりも強力な理由は次のとおりです。
● クエリの制限に使用する値を持つオブジェクトの値と、他のオブジェクトの値とを比較できます。
● WHERE 句を使用してサブクエリから返される値を制限できます。
● 単純なクエリフィルタでは式にすることが困難または不可能な複雑な質問を設定できます。たとえば、顧客、およびその
顧客が 2003 年の第 1 四半期(Q1)に(いずれかの顧客によって)すでに予約されていたサービスを購入した際の売上げ
の一覧を得ることができます。
サブクエリは、クエリデータを取得するために生成される SQL を変更することで動作します。SQL には、外部クエリから返され るデータを制限するサブクエリが含まれます。SQL はすべてのリレーショナルデータベース (RDBMS) でサポートされるクエリ 言語ですが、データベースごとに独自の構文があります。SQL サブクエリの詳細については、SQL に関する書籍を参照してく ださい。
注記
すべてのデータベースでサブクエリがサポートされているわけではありません。サポートされていない場合、サブクエリを作 成するオプションは、クエリパネルに表示されません。
注記
サブクエリの作成に使用できるのは、ディメンション、属性、およびメジャーだけです。階層オブジェクトを使用してサブクエ リを作成することはできません。
関連リンク
サブクエリを作成する [ページ 119]
サブクエリパラメータ [ページ 121]
4.9.3.2 サブクエリを作成する
1. クエリに表示するオブジェクトを[結果オブジェクト]枠に追加します。
2. サブクエリでフィルタ処理するオブジェクトを [結果オブジェクト] 枠で選択し、[クエリフィルタ] 枠の右上にある [サブクエリ の追加] をクリックします。
サブクエリのアウトラインが[クエリフィルタ]枠に表示されます。デフォルトでは、選択したオブジェクトがフィルタオブジェク トおよび適用フィルタオブジェクトとして表示されます。
3. サブクエリに WHERE 条件を追加するには、レポートオブジェクトを[オブジェクトをここにドロップ]ボックスの下のサブクエ リ領域にドラッグします。
4. サブクエリに WHERE 条件を追加するには、レポートオブジェクトを[オブジェクトをここにドロップ]ボックスの下のサブクエ リ領域にドラッグします。
既存のサブクエリまたは標準的なクエリフィルタを、サブクエリ内の WHERE 条件として使用できます。そのためには、既 存のフィルタまたはサブクエリを[オブジェクトをここにドロップ]ボックスの下のサブクエリ領域にドラッグアンドドロップしま す。既存のフィルタを WHERE 条件に移動するのではなくコピーするには、コントロールキーを押したままドラッグアンドド ロップします。この場合、既存のフィルタは元の場所に残り、そしてサブクエリの WHERE 条件の一部になります。
5. WHERE 条件でオブジェクトをフィルタ処理するための演算子と値を選択します。
6. [サブクエリ]をクリックして、その他のサブクエリをクエリフィルタに追加します。
AND または OR 関係でサブクエリをリンクするだけでなく、既存のサブクエリを[オブジェクトをここにドロップ]ボックスの 下の領域にドラッグすることで、それらをネスト(サブクエリの中にサブクエリを作成する)できます。この場合、内側のサブ クエリは外側のサブクエリの WHERE 条件の一部になります。サブクエリを WHERE 条件に移動するのではなくコピーす
るには、コントロールキーを押したままドラッグアンドドロップします。この場合、2 番目のサブクエリは最初と同じレベルに 残り、そして最初の WHERE 句の一部になります。
デフォルトでは、2 つのサブクエリは AND 関係でリンクされます。AND と OR を切り替えるには、[AND] 演算子をクリッ クします。
7. サブクエリをネストする(サブクエリの中にサブクエリを作成する)には、既存のサブクエリを[オブジェクトをここにドロップ] ボックスの下の領域にドラッグします。
サブクエリを WHERE 条件に移動するのではなくコピーするには、コントロールキーを押したままドラッグアンドドロップし ます。この場合、2 番目のサブクエリは最初と同じレベルに残り、そして最初の WHERE 句の一部になります。
内側のクエリは外側のクエリの WHERE 条件の一部になります。
関連リンク
定義済みのサブクエリ [ページ 118]
どの顧客が 2003 年の第 1 四半期にすでに予約されているサービスを購入したか、また、その売上げはいくらかを調べる [ページ 120]
サブクエリパラメータ [ページ 121]
4.9.3.3 どの顧客が 2003 年の第 1 四半期にすでに予約されているサ ービスを購入したか、また、その売上げはいくらかを調べる
クエリパネルが開いていることを確認します。
1. [国]および[売上げ]オブジェクトをクエリパネルの[結果オブジェクト]枠にドラッグします。
2. [サービス]オブジェクトを選択します。
3. [サブクエリ]をクリックします。
サブクエリのアウトラインが[クエリフィルタ]枠に表示されます。
注記
選択されたオブジェクトが、サブクエリの概要の両方のボックスに表示されます。多くの場合、両方のボックスで同じオ ブジェクトを使用しますが、必ずしもそのようにする必要はありません。オブジェクトが共通の値を返さない場合、サブ クエリは値を返さないため、クエリも値を返しません。
4. [予約年] オブジェクトを、[サービス] オブジェクトの下のサブクエリの概要の領域にドラッグして、[予約年] オブジェクトの
WHERE 条件を追加します。
5. [予約年]の条件演算子を[等しい]に設定します。
6. [定数を入力] ボックスに「FY2003」と入力します。
7. [予約年] オブジェクトを、[サービス] オブジェクトの下のサブクエリの概要の領域にドラッグして、[予約四半期] オブジェ
クトを WHERE 条件に追加します。
8. [予約四半期]の条件演算子を[等しい]に設定します。
9. [定数を入力] ボックスに「Q1」と入力します。
10. [クエリの実行]をクリックし、クエリを実行します。
4.9.3.4 サブクエリパラメータ
サブクエリまたはサブクエリのセットには、次のパラメータがあります。
パラメータ 説明
フィルタオブジェクト 結果オブジェクトをフィルタするためにその値が使用されるオ ブジェクト。
複数のフィルタオブジェクトを指定できます。その場合、選択 したオブジェクトの値は連結されます。
適用フィルタオブジェクト どのフィルタオブジェクトの値をサブクエリが返すかを決定す るオブジェクトです。
複数の適用フィルタオブジェクトを持つことができます。その 場合、選択したオブジェクトの値は連結されます。
演算子 フィルタオブジェクトと適用フィルタオブジェクトの関係を指定
する演算子です。
データベースによる制限のため、演算子と適用フィルタオブ ジェクトの特定の組み合わせは使用できません。たとえば、
[等しい(=)] 演算子と複数の値を返す適用フィルタオブジェク
トを使用すると、この種類のサブクエリでは 1 つの値のみを 返す適用フィルタオブジェクトが必要であるため、データベー
スはこの SQL を拒否します。
生成された SQL がデータベースによって拒否された場合、
エラーメッセージにはデータベースによって返されたエラーの 説明が表示されます。
WHERE 条件(オプション) 適用フィルタオブジェクトの値の一覧を制限する追加の条
件。WHERE 条件では、通常のレポートオブジェクト、定義済 みの条件または既存のクエリフィルタ(サブクエリを含む)を 使用できます。
関係演算子 複数のサブクエリがある場合は、この演算子がサブクエリ間
の関係を決定します。
AND - すべてのサブクエリの条件を満たす必要があります。
OR - いずれか 1 つのサブクエリの条件を満たす必要があり
ます。