グループ化して条件を指定する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の使い方でした。
コメント