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

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

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

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

Oracle

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

SQL

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

Q&A

解決済

2回答

424閲覧

SQLでのデータ作成

nomuyuka

総合スコア1

Oracle Database

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

Oracle

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

SQL

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

0グッド

0クリップ

投稿2022/07/29 08:56

編集2022/07/29 09:42

前提

SQL(Oracle)でデータを編集しています。
想定したデータにならず、お知恵をお借りできますと幸いです。
以下の私が考えていた以外の方法でも、やり方があればご教示いただきたく思います。
よろしくお願いします。

実現したいこと

  • 下記のTable2を作成する

週次でシステムからCaseのデータを記録しており、以下のTable1のようなデータを作成しています。ですが、システム上クローズ後には翌週以降のデータが作成されなくなるため、Table2のようなデータを作ろうとしています(1/22にクローズすると1/29のデータができなくなる)。データの記録日は毎月1、8、15、22、29(2月は28日)です。

■Table1
Case No  date   stage   last flag
Case1  20220101  ステージ1  N
Case1  20220108  ステージ1  N
Case1  20220115  ステージ2  N
Case1  20220122  ステージ4  N
Case1  20220129  ステージ5  N
Case1  20220201  クローズ   Y

Case2  20220108  ステージ3  N
Case2  20220115  ステージ4  N
Case2  20220122  クローズ   Y

■Table2
Case No  date   stage   last flag
Case1  20220101  ステージ1  
Case1  20220108  ステージ1  
Case1  20220115  ステージ2  
Case1  20220122  ステージ4  
Case1  20220129  ステージ5  
Case1  20220201  クローズ   
Case1  20220208  クローズ   
以下続く

Case2  20220108  ステージ3  
Case2  20220115  ステージ4  
Case2  20220122  クローズ   
Case2  20220129  クローズ   
Case2  20220201  クローズ   
Case1  20220208  クローズ   
以下続く

該当のソースコード

SELECT  dt.date  tr.* from 日付マスタ dt LEFT JOIN Table1 tr ON dt.date = tr.date ;

Create TABLE Table2

試したこと

日付マスタを作ってそれを左表にしてTable1と結合すれば、日付の右にNULLのセルができ、そこに、Table1のLast flagがついているデータを追加すればできるかと思っていたのですが、うまくいかずどうすればよいか困っているところです。上のSQLで下のような表ができたらいいなと思っていまいた。

イメージ
Date   Case No  date   stage   last flag

20220108  Case2  20220108  ステージ3  N
20220115  Case2  20220115  ステージ4  N
20220122  Case2  20220122  クローズ   Y
20220129  
20220201  

Last flag Yのみを集めたTableもあり、ここから上表のnullを埋めようとしていましたが、上表が作れず挫折しています。
Case1  20220201  クローズ   Y
Case2  20220122  クローズ   Y

よろしくお願いします。

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

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

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

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

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

sazi

2022/07/29 09:07

> システム上クローズ後にはデータが作成されなくなる Table1から削除されるという事ですか?
nomuyuka

2022/07/29 09:34

> sazi san ご質問ありがとうございます。わかりづらい記載ですいません。 CaseのステージがTable1に週次で記録され、ステージがクローズになるとクローズになった週だけそのデータができて、それ以降の週にはデータが作成されなくなります。 例えば、 1/15 ステージ3 1/22 クローズ の場合、Caseのステージは翌週の1/29もクローズの状態ですが、1/29分の行は作成されず1/22までしか行が追加されません。また、1/22のデータは残ります。 以上で説明になっていますでしょうか。 よろしくお願いします。
nomuyuka

2022/07/29 09:42

>Orlofsky san ご指摘ありがとうございました。 修正しました。 どうぞよろしくお願いいたします。
guest

回答2

0

日付マスタにはデータを記録する日付が格納されているということでよいでしょうか? やりかたはいろいろあると思いますが、たとえば以下のようなクエリで実現できるかと思います。

SQL

1SELECT A.CaseNo, B.Dt, SUBSTR(MAX(TO_CHAR(A.Dt, 'YYYYMMDD') || '@' || A.Stage), 10) LastStage 2FROM Table1 A 3JOIN 日付マスタ B ON A.Dt <= B.Dt 4GROUP BY A.CaseNo, B.Dt 5ORDER BY A.CaseNo, B.Dt

投稿2022/07/29 14:29

neko_the_shadow

総合スコア2230

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

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

nomuyuka

2022/08/04 18:05

neko_the_shadowさま ご回答ありがとうございました。また、返信とお礼が遅くなりまして失礼しました。 やってみたところ、SQL自体はうまく回ったのでデータの中身を検証しているところです。量が多くまだすべて見切れていないのですが、おおむねうまくいってそうです。 >日付マスタにはデータを記録する日付が格納されているということでよいでしょうか? おっしゃる通り、日付マスタにはデータの記録日だけが格納されています。 2022/02/01,2022/02/08/,2022/02/15 みたいな感じです。 今回はありがとうございました。大変助かりました。
guest

0

ベストアンサー

有効範囲の結合条件になるように考えます。
範囲を生成するには、集計関数よりコストの低い、Window関数のLead()を使用します。

SQL

1SELECT dt.date, tr.* 2from 日付マスタ dt 3 left join ( 4 select * 5 , lead(date, 1, 99991231) over(partition by CaseNo order by date) as LeadDate 6 from Table1 7 ) tr 8 ON dt.date >= tr.date and dt.date < tr.LeadDate

投稿2022/07/30 03:18

編集2022/07/30 03:25
sazi

総合スコア25188

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

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

nomuyuka

2022/07/31 17:39 編集

sazi様 回答ありがとうございます。また、参考URLもいただきまして、大変助かります。 いただいた回答を基に、実際に動かしてみたのですが、以下のエラーが出てしまいうまくいきませんでした。 エラー ORA-00923: FROM keyword not found where expected 自分でも、fromやかっこの位置やカンマなどを変えて試してみたのですが、うまくいかずにいます。 いただいたものをコピーするなどしたのですが、記載で間違いやすいところなどありますでしょうか。 よろしくお願いします。
sazi

2022/08/01 00:23

記述のエラーなので、実際に記述したSQLを見ないとアドバイスは難しいです。
nomuyuka

2022/08/04 06:27 編集

saziさま おっしゃる通りですね。もう一度やってみます。 Window関数など今まで使ったことがない知識もいただきましたので、改めて勉強したいと思います。 ありがとうございました。
nomuyuka

2022/08/23 01:14

saziさま その後、やり直してみてうまくいきました。私の方のデフォルトの日付形式の設定とあっていないのが原因でした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問