(※1) 抽出したデータ= WHERE 句で対象のデータを条件付けること。
(※2) 指定したキーワードで分類= GROUP BY 句 抽出結果のグルーピング。
部門でグループ化
サンプルデータを グループ化してみる。
SELECT DEPT_NO FROM USER_MASTER2 GROUP BY DEPT_NO
グループ化のイメージ(作業前)
利用者マスタ(USER_MASTER2)
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
0020
1001
小泉 純一
29
0019
1001
林 喜朗
12
0018
1002
少渕 恵三
21
0017
1003
橋本 虎太郎
33
0001
1003
鳩山 一代
8
0000
1003
影のボス
<NULL>
グループ化 STEP(1)
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
0020
1001
小泉 純一
29
0019
林 喜朗
12
0018
1002
少渕 恵三
21
0017
1003
橋本 虎太郎
33
0001
鳩山 一代
8
0000
影のボス
<NULL>
グループ化 STEP(2)
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
-
1001
-
-
-
1002
-
-
-
1003
-
-
注目する点は オレンジ色 の部分である。 オレンジ色の部分はグループ化によって情報が集約される。
この部分を取り出すには、集計関数を使用しなければならない。
集約された部分の値がすべて同じ場合、集計関数の MIN や MAX で取り出すという小技も使われることがある。
集計関数を使用しなければ以下のエラーが発生する。
SQL> SELECT DEPT_NO,USER_NAME FROM USER_MASTER2 GROUP BY DEPT_NO ;
SELECT DEPT_NO,USER_NAME FROM USER_MASTER2 GROUP BY DEPT_NO
*
行1でエラーが発生しました。:
ORA-00979: GROUP BYの式ではありません。
グループ化の例題の解答
部門別に利用者は何人いるか?
SELECT DEPT_NO, COUNT(*) FROM USER_MASTER2 GROUP BY DEPT_NO ;
グループ化 STEP(1)
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
0020
1001
小泉 純一
29
0019
林 喜朗
12
0018
1002
少渕 恵三
21
0017
1003
橋本 虎太郎
33
0001
鳩山 一代
8
0000
影のボス
<NULL>
グループ化 STEP(2)
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
COUNT(*)
-
1001
-
-
2
-
1002
-
-
1
-
1003
-
-
3
部門別に平均在職期間はどれくらいか?
SELECT DEPT_NO, AVG(TERM) FROM USER_MASTER2 GROUP BY DEPT_NO ;