🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

4107閲覧

sql:case式内での集約関数の使い方がわかりません

sakagami1234

総合スコア5

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/11/03 05:59

編集2019/11/03 06:23
SELECT S.NAME ,S.POINT ,CASE WHEN V.A= S.POINT THEN '最大' ELSE NULL END FROM STUDENT S ,(SELECT MAX(S.POINT) A FROM STUDENT S) V --NGコード SELECT S.NAME ,S.POINT, CASE WHEN MAX(S.POINT) = 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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/11/03 06:18

質問にCREATE TABLE文と何件かINSERT文と希望するSELECT結果を提示すると適切なコメントが付きやすいです。
sakagami1234

2019/11/03 06:24

ありがとうございます。
guest

回答2

0

ベストアンサー

select 項目に集計関数を使用して、集計関数以外の項目を指定するという事はそれらはGROUP BY 指定で明示されなければなりません。
質問の内容では、NAMEとPOINTです。
ただそれはエラーを回避する為にはという事で、求めるものは以下のような記述になります。

SQL

1SELECT NAME, POINT 2 , CASE WHEN POINT = (SELCT MAX(POINT) FROM STUDENT) THEN '最大' ELSE NULL END 3FROM STUDENT

投稿2019/11/03 09:18

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakagami1234

2019/11/03 10:21

ありがとうございます! 結局別での問い合わせが必要ということで理解しました!
Orlofsky

2019/11/03 13:16

CREATE TABLEとINSERTを提示するように依頼したのですが、無視されたので、きちんと追いかけませんでした。
sakagami1234

2019/11/04 02:39

見落としてました。 次回以降気を付けます。
guest

0

説明のために別名を変更します。

SQL

1SELECT MAX(S.POINT) AS MAX_POINT FROM STUDENT S

はSTUDENTテーブル全件の中の最大POINTを取得します。

SQL

1SELECT 2 S.NAME 3 , S.POINT 4 , CASE WHEN MAX(S.POINT) = S.POINT THEN '最大' ELSE NULL END 5FROM STUDENT S 6GROUP BY 7 S.NAME 8 , S.POINT

と厳格にGROUP BY句でSELECTしている列毎のグループ関数 MAX を指定しないと質問に記述したようにエラーになります。

NAMEだけでも複数あるだろうし、同じNAME内にも複数のPOINTがあるだろうから、
CASE WHEN MAX(S.POINT) ... が テーブル全件の中の最大POINT に等しいデータを取得するのは無理だろうということが想像できなくてはなりません。

SQL

1 , CASE WHEN MAX(S.POINT) = S.POINT THEN '最大' ELSE NULL END 23 , CASE WHEN MAX_POINT = S.POINT THEN '最大' ELSE NULL END

わかり易いネーミングを使うように心がけるのも自分の首を締めないために大切な一歩です。

投稿2019/11/03 06:51

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/11/03 07:03

質問の内容が当初とちょっと変わっていますね。回答の内容としては理解できるでしょうけど。
sakagami1234

2019/11/03 09:07

回答ありがとうございます。 そうですね。 ということは、テーブル内の最大値とカラムの値を比較するにはサブクエリなどで先に最大値を定数に置き換えたあとでなければ不可能ということでしょうか? 一つものコードのようなやり方が適切なアプローチになりますかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問