同一クエリ内で 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 条件を指定する
検索するグループを指定します。 詳細については、「 クエリ結果内の行のグループ化 (Visual Database Tools)」を参照してください。
WHERE
条件の基準になる列が[条件] ウィンドウにまだない場合は追加します。データ列が GROUP BY 句または集計関数に含まれていない場合は、 [出力] 列をオフにします。
[フィルター] 列で
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'
[グループ化] 列で、グループおよび集計のオプションの一覧の [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;