プロが教えるわが家の防犯対策術!

下記実行結果により、エラーが出現して困っている次第です。
回答のほどよろしくお願い致します。

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: 式がありません。

A 回答 (2件)

#1の指摘に加え...



問2の条件指定で使用している「 MGR NOT IS NULL 」ですが、
「 MGR IS NOT NULL 」もしくは「 NOT(MGR IS NULL) 」と書かねば
なりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
ちゃんとした結果が出ました。

お礼日時:2005/05/26 06:54

内容についての精査はしていませんが、文法についてだけお答えします。


問1
TO_CHAR(ROUND(SAL,1),'$9,999')は単一行関数なので、
TO_CHAR(AVG(ROUND(SAL,1)),'$9,999')とした方がよいでしょう
問2
(1)最低給与の後ろのカンマは余計です
(2)HAVINGの後ろはグループ関数なので、
   HAVING 1000 < MIN(SAL)とした方が良いでしょう。

これで取り敢えずエラーはなくなります

この回答への補足

回答ありがとうございます。
問1の方はエラーが消えました。本当に感謝します。
問2の方がまた違うエラーが出現しました。どこを修正すればエラーが消えるか分かりません。
回答のほどよろしくお願致します。

SELECT MGR AS 上司番号, MIN(SAL) AS 最低給与 FROM EMP WHERE MGR NOT IS NULL GROUP BY MGR HAVING 1000 < MIN(SAL)

ORA-00920: 関係演算子が無効です

補足日時:2005/05/25 21:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!