質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database

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

SQL

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

Q&A

解決済

3回答

3668閲覧

Oracle SQL Developer GROUP BY句のエラー解消方法について

k.k

総合スコア1

Oracle Database

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

SQL

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

0グッド

1クリップ

投稿2023/02/27 03:38

編集2023/02/27 05:50

実現したいこと

CASE句を含むSQLを実行し、条件分岐を行なうと同時にGROUP BYで括りたい

前提

元々あったSQLのコードを、CASE句を書き加え条件分岐で表示しようとしています。
ただ、実行を行ったところ、「GROUP BYの式ではありません」とエラーがでてしまいます。 CASE句の部分が原因かとは思うのですが、対処法が分かりません。
(調べる限りでは誤りがないようにみえるのですが、CASE句以外の部分で誤りがあるのでしょうか、、?)
どなたか解決策を教えていただけませんでしょうか?

※CASE句にて条件分岐する前のソースコードも記載しております。
コード中に「CODE_KBN = ’AH’」などと出てきますが、code_tableにて様々なコー. ドの区分や紐づくコードが定義されています。
今回の場合だと、「AH」というコード区分の中に更に番号が振られており、その番号が部署を判別するコードになります。

よろしくお願いします。

発生している問題・エラーメッセージ

ORA-00979: GROUP BYの式ではありません。
00979. 00000- “not a GROUP BY expression”
*Cause:
*Action
行1列1,538でエラー

該当のソースコード

Oracle SQL Developer上にて実行

※CASE句記載前のソースコード(こちらは正しく実行できます)

SELECT
substr(log.REQUEST_INFO,instr(log.REQUEST_INFO,’cyohyoID:[’) + 10) as 帳票ID,
code_tiiki.CODE_NAME as 地域,
COUNT(*) as 回数

FROM
log_table log
LEFT JOIN user_table user on log.user_id = user.user_id
LEFT JOIN
(SELECT CODE_KBN, CODE, CODE_NAME FROM code_table
WHERE CODE_KBN = ’AH’) code_tiiki on use.TIIKI_CD = code.CODE)

WHERE
log.time BETWEEN ’2022/12/26’ and ’2023/01/25’

GROUP BY
substr(log.REQUEST_INFO,instr(log.REQUEST_INFO,’cyohyoID:[’) + 10),
code_tiiki.CODE_NAME

ORDER BY
substr(log.REQUEST_INFO,instr(log.REQUEST_INFO,’cyohyoID:[’) + 10),
code_tiiki.CODE_NAME;

※CASE句にて条件分岐を行ったコード
こちらを実行するとエラーがでます

SELECT
substr(log.REQUEST_INFO,instr(log.REQUEST_INFO,’cyohyoID:[’) + 10) as 帳票ID,
CASE
WHEN user.BUSYO_CD IN (’014’, ’023’) THEN ’〇’
WHEN user.BUSYO_CD IN (’064’) THEN ’△’
WHEN user.BUSYO_CD IN (’065’) THEN ’□’
WHEN user.BUSYO_CD IN (’066’) THEN ’×’
ELSE code_tiiki.CODE_NAME
END as 地域,
COUNT(*) as 回数

FROM
log_table log
LEFT JOIN user_table user on log.user_id = user.user_id
LEFT JOIN
(SELECT CODE_KBN, CODE, CODE_NAME FROM code_table
WHERE CODE_KBN = ’AH’) code_tiiki on use.TIIKI_CD = code.CODE)

WHERE
log.time BETWEEN ‘2022/12/26’ and ‘2023/01/25’

GROUP BY
substr(log.REQUEST_INFO,instr(log.REQUEST_INFO,’cyohyoID:[’) + 10),
CASE
WHEN user.BUSYO_CD IN (’014’, ’023’) THEN ’〇’
WHEN user.BUSYO_CD IN (’064’) THEN ’△’
WHEN user.BUSYO_CD IN (’065’) THEN ’□’
WHEN user.BUSYO_CD IN (’066’) THEN ’×’
ELSE code_tiiki.CODE_NAME
END

ORDER BY
substr(log.REQUEST_INFO,instr(log.REQUEST_INFO,’cyohyoID:[’) + 10),
code_tiiki.CODE_NAME;

補足情報(FW/ツールのバージョンなど)

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - ProductionVersion 18.11.0.0.0

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

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

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

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

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

68user

2023/02/27 04:31 編集

エラー回避するなら group by user.BUSYO_CD じゃないですかね。欲しい結果的には、さらにもう一段階集約が必要かもしれませんが。
guest

回答3

0

where句までをサブクエリにしてgroup byをあとからやってはだめですか?
(クォートを調整)

SQL

1 2select 地域,COUNT(*) as 回数 3from (SELECT 4CASE 5WHEN user.BUSYO_CD IN ('014', '023') THEN '〇' 6WHEN user.BUSYO_CD IN ('064') THEN '△' 7WHEN user.BUSYO_CD IN ('065') THEN '□' 8WHEN user.BUSYO_CD IN ('066') THEN '×' 9END as 地域 10FROM 11log_table log 12LEFT JOIN user_table user on log.user_id = user.user_id 13WHERE 14log.time BETWEEN '2022/12/26' and '2023/01/25' 15) as t1 16GROUP BY 地域 17

投稿2023/02/27 04:33

編集2023/02/27 04:49
yambejp

総合スコア114769

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

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

k.k

2023/02/27 05:32

ご回答ありがとうございます。 教えていただいた内容で実行したところうまくいったのですが、追加で抽出条件が発生してしまいました、申し訳ありません、、、 改めて質問内容を更新しました。 同様にサブクエリで実行したのですが、抽出条件を追加したコード上で実行すると 「ORA-00904: ”CODE_TIIKI”.”CODE_NAME”が無効な識別子です。」とでてしまいます。 SQLに関してはど素人で何が間違いなのかわからない状態です。 同様のやり方でエラーを解除するには書き方が異なってくるのでしょうか?
guest

0

ベストアンサー

以下参考

SQL

1select 帳票ID, 地域, count(*) as 回数 2from ( 3 SELECT 4 substr(log.REQUEST_INFO,instr(log.REQUEST_INFO,'cyohyoID:[') + 10) as 帳票ID 5 , CASE 6 WHEN user.BUSYO_CD IN ('014', '023') THEN '〇' 7 WHEN user.BUSYO_CD IN ('064') THEN '△' 8 WHEN user.BUSYO_CD IN ('065') THEN '□' 9 WHEN user.BUSYO_CD IN ('066') THEN '×' 10 ELSE code.CODE_NAME 11 END as 地域 12 FROM 13 log_table log 14 LEFT JOIN user_table user 15 on log.user_id = user.user_id 16 LEFT JOIN code_table code 17 on use.TIIKI_CD = code.CODE 18 and code.CODE_KBN = 'AH' 19 WHERE 20 log.time BETWEEN '2022/12/26' and '2023/01/25' 21) as v1 22GROUP BY 帳票ID, 地域 23ORDER BY 帳票ID, 地域

投稿2023/02/27 06:26

編集2023/02/27 06:29
sazi

総合スコア25173

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

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

k.k

2023/02/27 07:00

ありがとうございます、理解できました! group byにcaseをそのまま入れられると思っていたんですが、一度サブクエリで列名を抜き出して指定しないといけなかったんですね、、
sazi

2023/02/27 10:00

> 一度サブクエリで列名を抜き出して指定しないといけなかったんですね そうではありません。 エラーになったSQLではGroup by指定していない、code_tiiki.CODE_NAMEをorder by しているからです。 サブクエリーにしているのは、どちらかというと可読性の向上と冗長さを省くためです。
guest

0

普通のシングルクォーテーション(')ではなく、左半分が下向きのシングルクォーテーション(‘)と右半分が上向きのシングルクォーテーション(’)のような特殊な文字を使用しているため、SQL文として解釈できません。

log.time BETWEEN ‘2022/12/26’ and ‘2023/01/25’

log.time BETWEEN '2022/12/26' and '2023/01/25'

であればいけるはずです。全て直す必要があります。

投稿2023/02/27 04:29

okuka

総合スコア54

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

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

k.k

2023/02/27 04:33

ご回答ありがとうございます。 失礼しました、こちらの質問はタブレットから行ったのですが、仕様なのか左側が下向きのシングルクォーテーションになっていました。 実行時のソースコードでは全て同一の上向きシングルクォーテーションにて実行したのですがエラーがでている状態です、、、 (selectのcase句の、as 地域 を除いた部分をgroup by 部分にコピペしているので同じはずです)
k.k

2023/02/27 04:35

失礼しました、特殊文字ではなくソースコードは全て通常のシングルクォーテーションでかこっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問