同一クエリ内で HAVING 句および WHERE 句を使用する (Visual Database Tools)

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

場合によっては、WHERE を使用してグループ全体に条件を適用する前に、HAVING 句を使用してグループから個別の行を除外する必要があります。

HAVING 句は WHERE 句に似ていますが、適用先はグループ全体だけであり、グループを示す結果セット内の行だけが対象になります。一方、WHERE 句は個々の行に適用されます。 1 つのクエリに WHERE 句と HAVING 句の両方を含めることができます。 そのような場合は、次の処理を行います。

  • 最初に、ダイアグラム ペインのテーブルまたはテーブル値オブジェクトの各行に WHERE 句が適用されます。 WHERE 句の条件を満たす行だけがグループ化されます。

  • その結果セットに含まれている行に、HAVING 句が適用されます。 HAVING 句の条件を満たすグループだけがクエリ出力に表示されます。 HAVING 句は、GROUP BY 句または集計関数にも使用されている列にだけ適用できます。

2 つの結合テーブルに WHERE 句と HAVING 句を指定する

Note

この記事で使用するデータベースは、GitHub 上の Microsoft SQL Server の Northwind および pubs サンプル データベースから入手できる pubs データベースです。

たとえば、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;

SQL Server Management Studio の Visual Database Tools では、HAVING 句と WHERE 句は、どちらも [条件] ウィンドウで作成できます。 既定では、列の検索条件を指定すると、条件が HAVING 句の一部になります。 ただし、条件を WHERE 句に変更することもできます。

同じ列を含む WHERE 句および HAVING 句を作成することも可能です。 これには、[条件] ウィンドウに列を 2 回追加し、一方を HAVING 句の一部として、他方を WHERE 句の一部として指定する必要があります。

集計クエリで WHERE 条件を指定する

  1. 検索するグループを指定します。 詳細については、「 クエリ結果内の行のグループ化 (Visual Database Tools)」を参照してください。

  2. WHERE 条件の基準になる列が[条件] ウィンドウにまだない場合は追加します。

  3. データ列が GROUP BY 句または集計関数に含まれていない場合は、 [出力] 列をオフにします。

  4. [フィルター] 列で WHERE 条件を指定します。 クエリとビュー デザイナーは、SQL ステートメントの HAVING 句に条件を追加します。

    Note

    上の手順の例では、クエリで 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'
    
  5. [グループ化] 列で、グループおよび集計のオプションの一覧の [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;