• 締切済み

グループ関数のエラーについて

下記SQLを実行するとエラーが返ってきます。 構文は合っていると思うのですが何故でしょうか。 1 select nation 2 from nation 3 group by nation 4* having area > avg(area) SQL> / having area > avg(area) * 行4でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。 副問合せをするとうまくいきました。 1 select nation 2 from nation 3* where area >(select avg(area) from nation) どちらの方法も同じ考え方だと思うのですが、上のやり方でエラーが出る理由を教えてほしいです。 回答のほどよろしくお願い致します。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • Oracle
  • 回答数1
  • ありがとう数3

みんなの回答

  • kougasha
  • ベストアンサー率32% (34/105)
回答No.1

having節は、GroupByで指定したものに対する条件式だからですね。 この場合は、副問い合わせが正解だと思います。

yukikundesuyo
質問者

お礼

いろいろ調べた結果とりあえず解決いたしました。 ありがとうございました。

yukikundesuyo
質問者

補足

回答ありがとうございました。 調べていくと原因は分かりました。 表を変えましたが、avg(sal) < salと列名を指定するとエラーになるようです。一番下にある数字を指定した場合、エラーになりません。 これはどうしてでしょうか? 回答のほどよろしくお願い致します。 1 select empno 2 from emp 3 group by empno 4* having avg(sal) < sal 5 / having avg(sal) < sal * 行4でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。 1 select empno 2 from emp 3 group by empno 4* having avg(sal) < comm SQL> / having avg(sal) < comm * 行4でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。 SQL> ed file afiedt.bufが書き込まれました。 1 select empno 2 from emp 3 group by empno 4* having avg(sal) < 100 SQL> / レコードが選択されませんでした。 SQL> desc emp; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

関連するQ&A

  • グループ関数の結果について

    以下、SQLコマンドを入力するとレコードが選択されない結果になってしまいます。areaの平均より高いものが出力されるはずなのですが何故でしょうか? / 1 select nation,area 2 from nation 3 group by nation, area 4* having area > avg(area) SQL> / レコードが選択されませんでした。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • エラー「単一グループのグループ関数ではありません」

    エラーをどうやれば修正できるかわかりません。 回答のほどよろしくお願いいたします。 SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP HAVING AVG(SAL) >ANY (SELECT SAL FROM EMP WHERE HIREDATE LIKE '82%') SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • 副問合せについて

    NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 14件 1 SELECT DISTINCT NATION_CODE FROM INVENTION 2* WHERE 100 >= ANY(SELECT POPULATION / AREA FROM NATION) 方法2:主問合せでINVENTION表を利用する 80件 SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) 出力件数が方法1と2で異なるわけですが同じことをしているので(つもり)件数が違う理由が今ひとつわかりません。 よろしくお願いいたします。 SQL> DESCRIBE INVENTION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- INVENTION NOT NULL VARCHAR2(30) INVENTOR VARCHAR2(30) YEAR NUMBER(4) NATION_CODE NUMBER(4) SQL> DESCRIBE NATION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • 副問合せ 続(Oracle SQL)

    問題:NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 方がうまくいきません。 私の考えた下記SQL文では実行結果が80件返ってしまいます。 答えは方法2と同じ5件ですがどこが悪いのでしょうか? 回答のほどよろしくお願い致します。 方法1:主問合せでNATION表を利用する SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) SELECT CODE FROM NATION WHERE POPULATION / AREA < 100;(上と同じ意味) INVENTION表の副問合せがうまくできていないので5件出力できない? 方法2:主問合せでINVENTION表を利用する SELECT DISTINCT NATION_CODE FROM INVENTION WHERE NATION_CODE = ANY(SELECT CODE FROM NATION WHERE 100 >= POPULATION / AREA) NATION_CODE ----------- 107 136 142 154 157 各表の構造はこのようになります。 SQL> DESCRIBE INVENTION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- INVENTION NOT NULL VARCHAR2(30) INVENTOR VARCHAR2(30) YEAR NUMBER(4) NATION_CODE NUMBER(4) SQL> DESCRIBE NATION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • グループ関数の問題でエラー!

    下記実行結果により、エラーが出現して困っている次第です。 回答のほどよろしくお願い致します。 SQL> describe emp; 名前 NULL? 型 ------------------------------ EMPNO  NOT NULL NUMBER(4) ENAME      VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO   NOT NULL NUMBER(2) 問1:EMP表より入社年、職種ごとの平均給与を表示しなさい。 平均給与は少数第2位を四捨五入して、$、3桁区切りカンマで表示 SELECT HIREDATE AS 入社年, JOB AS 職種 , TO_CHAR(ROUND(SAL,1),'$9,999') AS 平均給与 FROM EMP GROUP BY HIREDATE,JOB ORA-00979: GROUP BYの式ではありません 問2:上司番号と、その上司の部下の中で給与が最低である従業員の給与を表示しなさい。 上司が存在しない従業員を除き、最低給与が1000ドル以下のグループも除外とし、結果を表示。 SELECT MGR AS 上司番号, MIN(SAL) AS 最低給与, FROM EMP WHERE MGR NOT IS NULL GROUP BY MGR HAVING 1000 < SAL ORA-00936: 式がありません。

  • エラー2「無効な識別子です」

    ORA-00904: "D"."DEPT": 無効な識別子です。 先ほども似たような質問をしましたが原因がよく分からないなのでご存知の方教えていただければ幸いです。 SELECT D.DEPTNO, E.ENAME, E.SAL FROM EMP E, DEPT D WHERE E.SAL >ANY (SELECT MAX(E.SAL) FROM DEPT D, EMP E GROUP BY D.DEPT) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2) SQL> DESCRIBE DEPT; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)

  • エラー「無効な識別子です」

    ORA-00904: "EMPNO": 無効な識別子です と表示されます。 解決方法知っている方、教えていただければ幸いです。 SELECT EMPNO, ENAME, D.DEPTNO, DNAME FROM DEPT D WHERE EMPNO = (SELECT EMPNO FROM EMP WHERE MGR IS NULL) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • updateについて

    下記、SQLコマンドを実行するとMERTINの歩合給がSMITHのSALに格納されません。実行後、NULLが入ってしまいます。 ちゃんとemp表のMERTINのCOMMには値が入っているのになぜ実行結果がうまくいかないのでしょうか? 回答のほどよろしくお願い致します。 update w_emp set sal = (select comm from emp where ename = 'MERTIN') where sal < 1000 SQL> select * from w_emp; DEPTNO EMPNO ENAME JOB SAL 20 7902 FORD ANALYST 3000 20 7369 SMITH CLERK 10行が選択されました。 SQL> desc w_emp; 名前 NULL? 型 DEPTNO NOT NULL NUMBER(2) EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) SAL NUMBER(7,2) SQL> desc emp; 名前 NULL? 型 EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • SQL GROUP BY

    SQLについてお聞きしたいです。番号カラムの中で最大の数字をもつフィールドと 同じコードを持つデータを、表から全て取得したいと思っているのですが 書き出すとGROUP BYの式が間違っているというエラーが出てしまいます。 SELECT * FROM 表 GROUP BY コード HAVING MAX(番号) = コード どう調べればいいのか分からず四苦八苦しています。どこを直せばよいでしょうか?

  • 単一グループのグループ関数ではありませんについて

    以下の様なテーブルがあります。 SOSHIKI_CODE SYAIN_CLS DEL_DATE A部 0 A部 1 B部 1 B部 2 C部 3 組織毎の社員クラスをカウントしたいのですが、 以下のSQLを実行すると ORA-00937: 単一グループのグループ関数ではありません。 のエラーがでます。 どこがいけないのでしょうか。 いけない理由が知りたいのですが。 また、どこを直せばよいのでしょうか。 select soshiki_code -- ,syain_cls ,max(decode(syain_cls,'0',count(*),NULL)) ,max(decode(syain_cls,'1',count(*),NULL)) ,max(decode(syain_cls,'2',count(*),NULL)) ,max(decode(syain_cls,'3',count(*),NULL)) from syain_mst where del_date is NULL group by soshiki_code ,syain_cls order by soshiki_code ;