質問: S.POINT THEN '最大' ELSE NULL END FROM STUDENT S __________________________________________ ``` ### 前提・実現したいこと sqlでCASE式内での集約関数の扱いについての疑問です。 名前と点数を持ってるSTUDENTテーブル対して以下のような出力結果を得たいです。 行いたい結果は ユーザ 値 最大か否か A 100 B 200 C 300 D 400 E 500 最大 ですが、同じ実行結果を得るためにNGコードを書きましたが エラーを吐きます。 ### 発生している問題・エラーメッセージ エラーメッセージ ``` Error [row:2,col:1] ORA-00937: 単一グループのグループ関数ではありません。 ``` ### 試したこと CASE式内で集約関数が使えることは理解しています。 問題のコードにGROUP BY にSTUDENT.POINT,STUDENT.NAME を追記すれば実装結果は違いますが、 コードが走ることもしてます。 ということは、集約関数でテーブルの値を集約後に内部の値と比較するということが不可能なのでしょうか? ですが、集約関数同士での式は問題なく書けますし、すこし明快な理解ができていません。 有識者の方、よろしくお願いいたします。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: select 項目に集計関数を使用して、集計関数以外の項目を指定するという事はそれらはGROUP BY 指定で明示されなければなりません。 質問の内容では、NAMEとPOINTです。 ただそれはエラーを回避する為にはという事で、求めるものは以下のような記述になります。 ``` SELECT NAME, POINT , CASE WHEN POINT = (SELCT MAX(POINT) FROM STUDENT) THEN '最大' ELSE NULL END FROM STUDENT ```