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

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

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

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

SQL

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

Q&A

解決済

2回答

5401閲覧

【SQL】CASE文について

programer

総合スコア31

Oracle

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

SQL

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

0グッド

0クリップ

投稿2016/09/06 10:17

編集2016/09/06 11:02

ORACLE SQLについてです。
SELECT文内で演算し、
取得したデータを取得されたデータによって分岐させたいです。

SELECT T1.aaa, T1.bbb, MAX(T1.ccc) - SUM(T2.fff) AS ENZAN, FROM table1 T1, table2 T2 WHERE T1.aaa = T2.aaa

このENZANを0未満なら0と表示し、0以上ならその演算した値で表示させたいです。
CASE文を使用して試してみましたが、様々なエラーが表示されてしまい、
うまく取得することができませんでした。

SELECT T1.aaa, T1.bbb, (CASE WHEN MAX(T1.ccc) - SUM(T2.fff) > 0 THEN MAX(T1.ccc) - SUM(T2.fff) WHEN MAX(T1.ccc) - SUM(T2.fff) <= 0 THEN 0 END AS ENZAN), FROM TABLE1 T1, TABLE2 T2 WHERE T1.aaa = T2.aaa AND T1.bbb = T2.bbb

このような記述の仕方ではダメなのでしょうか。

T1
aaa VERCAHR2 P
bbb VERCAHR2 P
ccc NUMBER

T2
aaa VERCAHR2 P
bbb VERCAHR2 P
fff NUMBER

項目数は完全一致です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/09/06 10:31

T1とT2のレコード数は完全一致でしょうか、それとも主従関係があったりするのでしょうか。
programer

2016/09/06 10:45

テーブル構造を追記させていただきました。 申し訳ありません。 レコード数は完全一致です。
退会済みユーザー

退会済みユーザー

2016/09/06 10:52 編集

どちらも、aaaとbbbが主キーになっているのか、そうじゃないのかも教えて下さい。ユニークキーなども。
programer

2016/09/06 11:04

大変申し訳ありません。 主キー等のテーブル情報も追記させていただきました。
guest

回答2

0

ベストアンサー

SUM、MAX、MINなど集約関数を利用し、
かつ集約関数を用いていないカラム(今回の場合T1.aaaなど集約関数を使っていないもの)を指定したい場合は、*GROUP BY句でそのカラムを指定してあげるのがルールとなっています。
(※非集約項目はグループ化された際にどの値を表示しなければならないか分からないため)

そのため今回のクエリでは、
GROUP BY指定が必要となると思われます。

ただ提示していただいているテーブル構造的に、
今回の演算では全レコードのMAX、SUM値を取りたいのかなと思わるので、
期待した値を得るには「T1.aaa」、「T1.bbb」をSELECT句から外すか、
こいつらも集約関数で取得するようすると演算結果は想定通りのものとなるのかなと思われます。
(※後者のMAXかMINで取得した「T1.aaa」「T1.bbb」は期待通りの値表示とならない可能性が高いです)

また提示コードのケース式

SQL

1(CASE WHEN MAX(T1.ccc) - SUM(T2.fff) > 0 THEN MAX(T1.ccc) - SUM(T2.fff) 2 WHEN MAX(T1.ccc) - SUM(T2.fff) <= 0 THEN 0 3 END AS ENZAN)

上記は列別名を指定する箇所が恐らく構文エラーとなっていると思われます。
正しくは下記のように修正するとケース式での構文エラーは起こらなくなるのではないでしょうか?

SQL

1(CASE WHEN MAX(T1.ccc) - SUM(T2.fff) > 0 THEN MAX(T1.ccc) - SUM(T2.fff) 2 WHEN MAX(T1.ccc) - SUM(T2.fff) <= 0 THEN 0 3 END) AS ENZAN /* 列別名の指定箇所はカッコの外で */

投稿2016/09/06 13:07

編集2016/09/06 13:14
Panzer_vor

総合スコア1636

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

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

programer

2016/09/07 00:41

サンプルまで作成していただき、丁寧なご指摘ありがとうございす。 確かにGROUP BYは必要ですよね。 非集約項目をGROUP BYすることで解決することができました。 ありがとうございました。
Panzer_vor

2016/09/07 12:42

> programerさん 少し気になったので補足をば。 提示して下さっているテーブル構造では「aaa」、「bbb」の複合主キーとなっていますが、 上記2項目で一意となるのであれば、集約自体不要となるのではないでしょうか? 提示通りであればGROUP BYと集約関数を外した普通のSELECTで要件を満たせそうな気がします。 またT1とT2のレコード数と主キーが完全一致する場合は、 業務的に大きな意味がなければ1つのテーブルとするのも一案です。 1つとした場合は下記のようなイメージとなります。 NEW_T aaa VERCAHR2 P bbb VERCAHR2 P ccc NUMBER fff NUMBER
guest

0

CASE式 http://docs.oracle.com/cd/E57425_01/121/SQLRF/expressions004.htm#i1033392 ですよね。
それ以前に、MAXやSUMするなら、GROUP BY句が必要でしょうね。
データ構造やテーブル同士の依存関係がわからないため、
じゃぁどう書けばいいかという回答は現段階ではいたしかねます。

投稿2016/09/06 10:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

programer

2016/09/06 10:46

申し訳ありません。 簡単なテーブル構造を追記させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問