次の方法で共有


同じクエリで HAVING 句と WHERE 句を使用する (Visual Database Tools)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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

HAVING 句は WHERE 句に似ていますが、グループ全体 (つまり、グループを表す結果セット内の行) にのみ適用されますが、WHERE 句は個々の行に適用されます。 クエリには、WHERE 句と HAVING 句の両方を含めることができます。 その場合:

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

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

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

手記

この記事で使用するデータベースは pubs データベースであり、GitHub の Microsoft SQL Server 用の Northwind および 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 句の一部として 1 つのインスタンスを指定し、もう一方のインスタンスを WHERE 句の一部として指定する必要があります。

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

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

  2. 抽出条件 ペインにまだ表示されていない場合は、WHERE 条件の基にする列を追加します。

  3. データ列が GROUP BY 句の一部であるか、集計関数に含まれていない場合は、Output 列をクリアします。

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

    手記

    このプロシージャの例に示すクエリは、titlespublishersの 2 つのテーブルを結合します。

    クエリのこの時点で、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. [グループ化] 列で、グループと概要のオプションの一覧から [場所] を選択します。 クエリおよびビュー デザイナーは、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;