【SQL Server】HAVING の使い方(グループ化の条件)

グループ化して条件を指定するHAVING

グループ化

SQL Serverでは「HAVING」を使うことができます。「HAVING」は「GROUP BY」でグループ化した結果に条件指定します。

  • WHERE
    条件で抽出した結果をGROUP BYでグループ化します
    WHERE→GROUP BY の順番
  • HAVING
    GROUP BYでグループ化したあとにHAVINGの条件で抽出します
    GROUP BY→HAVING の順番

同じく条件指定するものに「WHERE」があります。「WHERE」で条件で抽出したあとにGROUP BYでグループ化します。

それに対して「HAVING」はGROUP BYでグループ化したあとに「HAVING」の条件で抽出します。

HAVING の使用例

サンプルデータ

--EMPテーブルを取得 
SELECT emp_name1,emp_name2,age FROM emp
WHERE address = '北海道';
EMP_NAME1 EMP_NAME2 AGE
佐藤 太郎 45
佐藤 花子 24
佐藤 一郎 40
加藤 和夫 20
加藤 史郎 18
吉田 直樹 35
井上 34

例1. グループ化したレコードで件数指定するパターン

--北海道在住で同じ苗字の人が複数いるか?
SELECT emp_name1,COUNT(emp_name1) FROM emp
WHERE address= '北海道' 
GROUP BY emp_name1
HAVING COUNT(*) > 1;
EMP_NAME1 COUNT(EMP_NAME1)
佐藤 3
加藤 2

ここでは「北海道に住んでいる人で同じ苗字の人がいるか?」を検索します。

「GROUP BY EMP_NAME1」で苗字でグループ化し、さらに「HAVING COUNT(*) > 1」という条件により、グループ化した「苗字」の件数が1件より大きい、つまり「同じ苗字の人が複数いる苗字」を抽出しました。

例2. グループ化したレコードで合計指定するパターン

--同じ苗字で年齢の合計が100歳以上の苗字を取得
SELECT emp_name1,SUM(age) FROM emp
WHERE address= '北海道' 
GROUP BY emp_name1
HAVING SUM(age) > 100;
EMP_NAME1 SUM(AGE)
佐藤 109

ここでは「GROUP BY emp_name1」で名前(苗字)ごとにグループ化し、「HAVING SUM(age) > 100」で年齢合計が100才以上の苗字の人を抽出しました。

これでHAVINGをつかってグループ化して条件を指定して取得することができました。

以上、SQL Serverでグループ化して条件を指定するHAVINGの使い方でした。

コメント