4 クエリの作成
4.7 複合クエリの使用
4.7.1 複合クエリの定義
複合クエリとは、連携して単一の結果を返すクエリのグループのことです。クエリは、次の 3 つの関係で結合できます。
● ユニオン
● インターセクション
● マイナス
ユニオンクエリは、両方のクエリからすべてのデータを取得し、重複する行を削除して、複合データセットを作成します。
インターセクションクエリは、両方のクエリに共通するデータを返します。
マイナスクエリは、最初のクエリにはあって 2 つ目のクエリにはないデータを返します。
注記
BEx クエリまたは OLAP クエリは組み合わせられません。
例
ユニオン、インターセクション、およびマイナスのクエリ
この例では、次の表に示されるように国の一覧を返す 2 つのクエリがあるものとします。
クエリ 値
クエリ 1 アメリカ; イギリス; ドイツ; フランス
クエリ 2 アメリカ; スペイン
複合クエリの種類に応じて、次の値が返されます。
結合の種類 値
UNION アメリカ; イギリス; ドイツ; フランス; スペイン
INTERSECT アメリカ;
MINUS イギリス; ドイツ; フランス
関連リンク
BEx クエリの定義 [ページ 68]
4.7.2 複合クエリの使用
複合クエリを使用すると、標準のクエリでは作成しにくい、または作成できない質問に答えることができます。
例
複合クエリを使用したデータセットを返す
[アイランドリゾートマーケティング]サンプルユニバースには、リゾートにすでに滞在している客を返す"年"ディメンションと、
今後滞在するために予約している客を返す"予約年"というディメンションがあります。データベースとユニバースの構造に より、これらのオブジェクトには互換性がありません。つまり、レポート内の同じブロックにそれらを含めることはできませ ん。
リゾートに滞在した客数が n 人を超えた年と、リゾートへの滞在を予約した客数が n 人を超えた年を示す、年の単一の一 覧を返すには、どのようにすればよいでしょうか。それには、次のような複合クエリを使用します。
クエリ 戻り値
クエリ 1 リゾートに滞在した客数が n 人を超えた年
UNION
クエリ 2 リゾートへの滞在を予約した客数が n 人を超えた年 これらの 2 つのクエリ間にユニオンを使用すると、必要な年の一覧が返されます。
4.7.3 複合クエリの生成方法
使用しているデータベースがクエリに含まれる結合の種類をサポートしている場合は、データベースレベルで複合クエリが動 作します。つまり、データベースに送信したクエリが変更されます。変更は、ユニオン、インターセクション、およびマイナスの演 算子を含むクエリスクリプトを生成することによって行われます。
使用しているデータベースがクエリに含まれる結合の種類をサポートしていない場合は、データが取得された後に結合が行 われます。複数のクエリからレポートにデータが返された後、返されたデータはデータベースレベルの複合クエリにより生成さ れる結果と同じものになります。
4.7.4 複合クエリを作成する
1. クエリパネルで最初のクエリを作成します。
2. ツールバーの [複合クエリの追加] アイコンをクリックして、クエリオブジェクトの一覧の下に [複合クエリ] パネルを表示し ます。
[複合クエリ] パネルに現在のクエリが表示されます。クエリの名前を変更するには、パネルでクエリをクリックし、メニュー から [名前の編集] を選択して、表示されたダイアログボックスの [名前] ボックスに新しい名前を入力します。
3. [クエリの追加] をクリックして、別のクエリを追加します。2 つ目のクエリが [複合クエリ] 枠に表示されます。このクエリに は次の特徴があります。
○ 元のクエリとユニオン関係で結合されます。
○ Combined Query #n という名前が付けられます。
4. クエリを切り替えるには、[複合クエリ] 枠でクエリをクリックします。
5. クエリを削除するには、[複合クエリ] 枠でクエリを選択して Delete キーを押すか、そのクエリをユニバースの外側にドラッ グアンドドロップします。
6. 結合の種類を変更するには、演算子をクリックします。演算子は、ユニオン、マイナス、インターセクションの順に切り替わ ります。
7. 通常のクエリを作成するのと同じ方法で、複合クエリ内に各クエリを作成します。
8. [クエリの実行]をクリックします。
4.7.5 複合クエリの構造
複合クエリ内のクエリは、同じデータ型の同じ数のオブジェクトを返す必要があり、オブジェクトは同じ順序であることが必要で す。クエリ結果のオブジェクトの数とそれらのオブジェクトのデータ型が異なる場合、クエリは結合できません。たとえば、[年]
を返すクエリと[年]および[売上げ]を返すクエリを結合したり、[年]を返すクエリと[売上げ]を返すクエリを結合したりすること はできません。
また、複合クエリのセマンティックにも注意する必要があります。[年]を返すクエリと[地域]を返すクエリが同じデータ型である 場合、これらを結合することは可能ですが、その結果は年と地域が混在した一覧になり、意味のないものになります。通常、
最初のクエリに[年]ディメンションが含まれる場合、2 つ目のクエリにも年のリストを返すディメンションが含まれます。
4.7.5.1 客数に基づいて年と予約年の一覧を返す
リゾートに滞在した客数が n 人を超えた年と、リゾートへの滞在を予約した客数が n 人を超えた年で構成される、年の一覧を 返すクエリを作成するとします。フィルタリングされたオブジェクトも [結果オブジェクト] 枠に表示されます。
1. ユニバースの一覧から [アイランドリゾートマーケティング] ユニバースを選択し、クエリパネルを開きます。
2. [年]、[客数]、[将来の客] オブジェクトを [結果オブジェクト] 枠にドラッグします。
3. [客数] オブジェクトを [クエリフィルタ] ペインにドラッグして、n 人を超えた [客数] のみに制限するレポートフィルタを作成 します。
4. [複合クエリの追加] をクリックします。
[複合クエリ]枠は、クエリパネルの左下に表示され、ユニオンで結合された 2 つのクエリが示されます。
5. 2 つ目のクエリをクリックし、[年]および[客数]オブジェクトを削除します。
6. “予約年”オブジェクトを[結果オブジェクト]枠にドラッグします。
7. [予定客数]オブジェクトを[クエリフィルタ]枠にドラッグして、n 人を超えた予定客数のみに制限するレポートフィルタを作 成します。
8. [クエリの実行]をクリックします。
クエリは、年と予約年の複合リストを返します。
4.7.6 複合クエリの優先順位
複合クエリにおける実行の順序は、最終的な結果を決定する際に重要です。
最も単純な複合クエリでは、次の例のように、あるリレーションシップで 2 つ以上のクエリを結合します。
クエリ 1
INTERSECTION クエリ 2
クエリ 3
このような場合、最初に計算される結果は、複合クエリ n と複合クエリ n + 1 のインターセクションです。次に計算される結果 は、最初の結果と複合クエリ n + 2 のインターセクションです。このリレーションシップにおけるすべてクエリの処理をこの方法 で続けます。これにより、上記の例の場合は、次のような結果になります。
クエリ データ
クエリ 1 アメリカ; イギリス; フランス; ドイツ クエリ 2 アメリカ; フランス; フィンランド 1 と 2 のインターセクション アメリカ; フランス
クエリ 3 アメリカ; スペイン
最終的なインターセクション アメリカ
4.7.6.1 複合クエリのネスト
複合クエリを追加すると、その複合クエリはデフォルトで既存のクエリの最初の複合レベルで結合されます。クエリを追加する たびに、複合クエリのリストが拡張されます。すでにユニオンリレーションシップで複合されているクエリ 1 とクエリ 2 に、クエリ 3 を追加すると、次のようになります。
UNION クエリ 1
クエリ 2 クエリ 3
複合クエリを複雑な複数レベルのリレーションシップでネストして、実行の順序をコントロールすることもできます。たとえば次 の例のように、クエリ 1 MINUS クエリ 2 の結果をインターセクトのリレーションシップでクエリ 3 と結合することができます。
複合クエリ 1 MINUS
INTERSECT 複合クエリ 2
クエリ 3
クエリグループは、右から左へ処理され、各グループ内では上から下に処理されます。上記の例の MINUS グループのよう に、優先度の高いグループは右側にインデントされて表示されます。上の例で、最初に計算されるクエリは MINUS クエリで
す。次に MINUS クエリの結果が、INTERSECT クエリによってクエリ 3 と結合されます。
クエリ 結果
クエリ 1 アメリカ; イギリス; スペイン; ドイツ
クエリ 2 ドイツ
クエリ 結果
クエリ 1[MINUS]クエリ 2 アメリカ; イギリス; スペイン
クエリ 3 アメリカ; スペイン; フィンランド (クエリ 1[MINUS]クエリ 2)
INTERSECT クエリ 3
アメリカ; スペイン
注記
データベースが、実行する種類の複合クエリを直接サポートする場合、クエリによって生成されるスクリプトには直に結合 演算子が含まれます。この場合の優先順位は、データベースで定義された優先順位に基づいて決まります。詳細について は、データベース管理者に確認してください。
4.7.6.2 複合クエリの優先順位を設定する
1. 編成するクエリを [複合クエリ] パネルで作成します。
2. 1 組のクエリをネストするには、新しい複合クエリノードを作成するために [新しい複合クエリノードの追加] ボタンをクリッ
クしてから、1 つのクエリを、ネストしたペアに関連付けるクエリの上にドラッグアンドドロップします。
新しい複合クエリノードは、デフォルトでユニオン関係となります。
3. ネストされたグループに続けてクエリを追加するには、すでにグループに存在する任意の 2 つのクエリの間のスペースに クエリをドラッグアンドドロップします。
4. 既存の優先順位の高いグループ内にさらにネストしたグループを作成する場合は、上の 2 つの手順を繰り返します。
5. クエリ内のすべてのグループの結合演算子をクリックし、それらを必要に応じて変更します。
関連リンク
複合クエリを作成する [ページ 89]