同一クエリ内で HAVING 句および WHERE 句を使用する方法 (Visual Database Tools)
場合によっては、HAVING を使用してグループ全体に条件を適用する前に、WHERE 句を使用してグループから個別の行を除外する必要があります。
HAVING 句は WHERE 句に似ていますが、適用先はグループ全体だけであり、グループを示す結果セット内の行だけが対象になります。一方、WHERE 句は個々の行に適用されます。 1 つのクエリに WHERE 句と HAVING 句の両方を含めることができます。 そのような場合は、次の処理を行います。
最初に、ダイアグラム ペインのテーブルまたはテーブル値オブジェクトの各行に WHERE 句が適用されます。 WHERE 句の条件を満たす行だけがグループ化されます。
その結果セットに含まれている行に、HAVING 句が適用されます。 HAVING 句の条件を満たすグループだけがクエリ出力に表示されます。 HAVING 句は、GROUP BY 句または集計関数にも使用されている列にだけ適用できます。
たとえば、titles テーブルと publishers テーブルを結合して、出版社全体の本の平均価格を表示するクエリを作成するとします。 ここでは、カリフォルニア州の出版社など、特定の出版社グループの平均価格だけを表示するとします。 さらに、$10.00 を超える平均価格だけを表示するとします。
平均価格を計算する前に、カリフォルニア州以外の出版社を除外するために、WHERE 句で最初の条件を設定します。 2 番目の条件は、データのグループ化および集計の結果に基づくため、HAVING 句で指定する必要があります。 結果として作成される SQL ステートメントは次のようになります。
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10
HAVING 句および WHERE 句は、どちらも抽出条件ペインで作成できます。 既定では、列の検索条件を指定すると、条件が HAVING 句の一部になります。 ただし、条件を WHERE 句に変更することもできます。
同じ列を含む WHERE 句および HAVING 句を作成することも可能です。 これには、抽出条件ペインに列を 2 回作成し、一方を HAVING 句の一部として、他方を WHERE 句の一部として指定します。
集計クエリで WHERE 条件を指定するには
検索するグループを指定します。 詳細については、「クエリ結果内の行のグループ化 (Visual Database Tools)」を参照してください。
WHERE 条件の基準とする列が抽出条件ペインにまだない場合は、抽出条件ペインに追加します。
データ列が GROUP BY 句または集計関数に含まれていない場合は、[出力] 列をオフにします。
[フィルター] 列で WHERE 条件を指定します。 SQL ステートメントの HAVING 句に、指定した条件が追加されます。
注 上の手順の例では、クエリで 2 つのテーブル titles および publishers を結合しています。
クエリのこの時点で、SQL ステートメントには HAVING 句が次のように含まれています。
SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA'
[グループ化] 列で、グループおよび集計のオプションの一覧の [Where 条件] をクリックします。 SQL ステートメントの HAVING 句から条件が削除され、WHERE 句に条件が追加されます。
SQL ステートメントは、WHERE 句を含むように次のように変更されます。
SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id