てぃぐれのプログラマwiki

ワクワクに従う

集計関数 問合せできない?できる? 【ORACLE】

経緯

集計関数の問合せできるできないルールがちょっと混乱することがあるので、解いて行きたい。

 

1,集計関数でネストしている場合

SELECT MIN(AVG(sal)) FROM emp;

employees の salary の 平均avg の 最小値min が欲しい。一見良さそうであるが、group by句がないので2つ目のネストはできない。1つ目までなら可能である。

 実際のエラー

  → ORA-00978: nested group function without GROUP BY

 対処

 ①group byつけてみる

  →OK

 ②SELECT AVG(sal) FROM emp;(MINを抜いてみる)

  →OK

 

2,集計関数でネストしていて、select句でグループ化のキーがある場合

SELECT empno, AVG(MIN(sal)) FROM emp GROUP BY empno;

集計関数を集計関数でネストするとselect句でグループ化のキーの設定ができない。

GROUP BYで設定していないキーはselect句で設定できないのだ。

 

 実際のエラー

  →ORA-00937: not a single-group group function

 

 対処法

 ①ネストを解く

  SELECT empno, MIN(sal) FROM emp GROUP BY empno;

  →OK

 ②select句のempnoを外す

  →OK

 

3,複数のキーでグループ化

SELECT deptno, empno, MIN(sal) FROM emp GROUP BY empno,deptno;

 →OK

 

4,GROUP BY句がないHAVING句は指定できない

SELECT job, MIN(sal) FROM emp HAVING job='SALESMAN';

実際のエラー

  →ORA-00979: not a GROUP BY expression

  

 

5,HAVING句はグループ化後の結果に対して絞り込む

SELECT job, MIN(sal) FROM emp group by job HAVING MIN(sal) > 200;