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 ;
グループ化 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)
AVG(TERM)
-
1001
-
(29,12)
20.5
-
1002
-
(21)
21
-
1003
-
(33,8,NULL)
(※) 20.5
(※) 集計関数のほとんどが NULL を無視する。
グループ化した後のさらなる条件付け HAVING
在職期間の平均が XX になる部門はどこか? という例題を解答するには、グループ化した結果にさらになる条件付けが必要である。
これには 「HAVING」 という句を使用する。HAVING はグループ化した結果セットへの WHERE 条件である。
グループ化のみ
SELECT DEPT_NO, AVG(TERM) FROM USER_MASTER2 GROUP BY DEPT_NO ;
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
AVG(TERM)
-
1001
-
(29,12)
20.5
-
1002
-
(21)
21
-
1003
-
(33,8,NULL)
20.5
グループ化と HAVING
HAVING による 条件付け 在職期間の平均が 20.5 の部門を取得する。
SELECT DEPT_NO FROM USER_MASTER2 GROUP BY DEPT_NO HAVING AVG(TERM) = 20.5
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
AVG(TERM)
-
1001
-
(29,12)
20.5
-
1003
-
(33,8,NULL)
20.5
WHERE、GROUP BY と HAVING の使用
これまでの SQL に WHERE 条件を加える。在職期間が 10 以下のものを対象外とする。
SELECT DEPT_NO FROM USER_MASTER2 WHERE TERM<=10 GROUP BY DEPT_NO HAVING AVG(TERM) = 20.5
利用者ID (USER_ID)
部門 (DEPT_NO)
利用者名 (USER_NAME)
在職期間 (TERM)
AVG(TERM)
-
1001
-
(29,12)
20.5
-
1003
-
(33,8,NULL)
33
部門 1003 は検索結果に該当しなくなる。
HAVING 句 と WHERE 句との違い
HAVING と WHERE 句との違いとは、グループ化した 「結果の集計後」の結果への条件か、レコードをグループ化処理する前の「表全体のレコード」への条件かの違いである。
つまり [表からの絞り込みは WHERE] ⇒ [結果の集計は GROUP BY] ⇒ [集計結果レコードからのさらなる選別は HAVING ] という処理となる。