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

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

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

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

SQL

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

Q&A

解決済

1回答

1789閲覧

【oracleSQL】case式のthen旬に複数の処理を書きたい

hk3150

総合スコア11

Oracle

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

SQL

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

0グッド

1クリップ

投稿2021/10/13 03:05

編集2021/10/13 04:04

前提・実現したいこと

以下のテーブルにてSQLを実行しておりますが、エラーとなってしまいます。

then旬に複数の処理を書きたいのですが、うまく実行できません。
then句には条件を2つ以上書くことはできないのでしょうか?
また、条件を2つ以上書く以外に、
同様の処理を実行する方法はございますでしょうか

実現したいこと:
変更キー列が空白の列と、
変更キー列がSTARTかつ変更日が今月以降の列、以前ならENDの列を取得したいです。

※サンプルテーブル
|親部品|子部品|変更キー|変更年月|
|:--|:--:|--:|
|AAA|a-000| |000000|
|AAA|a-000| |000000|
|AAA|a-111|END|202109|
|AAA|a-999|START|202110|
|CCC|c-000| |000000|
|CCC|c-111|END|202110|
|CCC|c-999|START|202111|
|BBB|b-000| |000000|
|BBB|b-111|END|202108|
|BBB|b-999|START|202109|

↓↓↓↓↓↓↓↓↓取得したい結果↓↓↓↓↓↓↓↓↓↓
|親部品|子部品|変更キー|変更日|
|:--|:--:|--:|
|AAA|a-000| |000000|
|AAA|a-000| |000000|
|AAA|a-999|START|202110|
|CCC|c-000| |000000|
|CCC|c-111|END|202110|
|BBB|b-000| |000000|
|BBB|b-999|START|202109|

該当のソースコード

SQL

1select * 2from サンプルテーブル 3where (親部品 like 'AAA' or 親部品 like 'BBB') 4and (CASE WHEN 変更キー like ' ' then 'OK' 5 WHEN 変更キー like 'S' and to_char(sysdate,'YYYYMM') >= 変更日 then 'OK' and 変更キー like 'E' = 'NG' 6 else 'NG' end ) = 'OK' ↑    ここです    ↑

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

oracle SQL

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

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

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

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

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

sazi

2021/10/13 03:27

条件がSQLでは不明なため、希望する取得結果も追記して下さい。 条件より、変更キーがENDの行を取得する事の方が本題な気がします。
hk3150

2021/10/13 04:04

sazi様、いつもお世話になります。 取得したい結果を本文に追記致しました、よろしくお願いいたします。
sazi

2021/10/13 04:34 編集

> STARTかつ変更日が今月以降の列、以前ならENDの列を取得したい これは同じ親部品での話ですか?
hk3150

2021/10/13 04:57

すみません、同じ親部品の話でございます。
guest

回答1

0

ベストアンサー

単なる条件では抽出できません。
同じ親部品内で、現在日以前での過去直近のENDかSTARTのデータをピックアップする必要がありますので、副問合せが必要です。

select * from sample s where 変更キー is null or ( 変更キー in ('START', 'END') and 変更年月 = ( select max(変更年月) from sample where 変更キー in ('START', 'END') and 親部品=s.親部品 and 変更年月<= to_char(sysdate,'YYYYMM') ) )

投稿2021/10/13 04:31

編集2021/10/13 05:10
sazi

総合スコア25430

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

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

hk3150

2021/10/13 07:38

ご回答ありがとうございます! いつも勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問