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

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

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

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

SQL

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

Q&A

解決済

3回答

384閲覧

日付の連番を作成したい

kaiji24

総合スコア5

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

SQL

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

0グッド

0クリップ

投稿2023/05/18 14:23

実現したいこと

以下の様なテーブルがあったとき、

employee_nostart_dateend_date
111112023/1/32023/1/3
222222023/1/32023/1/3
333332023/1/32023/1/5

以下のように並べかえをしたい

effective_dateemployee_no
2023/1/311111
2023/1/322222
2023/1/333333
2023/1/433333
2023/1/533333

該当のソースコード

SQL(oracle)

1SELECT TO_DATE(start_date,'YYYY/MM/DD' HH24:MI:SS')+LEVEL -1 AS effective_date,employee_no FROM EMPLOYEE CONNECT BY TO_DATE(start_date,'YYYY/MM/DD' HH24:MI:SS')+LEVEL -1 <=TO_DATE(end_date,'YYYY/MM/DD' HH24:MI:SS');

試したこと

上記結果は、以下のようになり、想定どおりになりません。
11111,1/3
22222,1/3
33333,1/3
33333,1/4
33333,1/4
33333,1/4
33333,1/5
33333,1/5
33333,1/5

ちなみに、以下レコードのみであれば、

employee_nostart_dateend_date
333332023/1/32023/1/5

出力結果は上手く出力されます。
1/3,33333
1/4,33333
1/5,33333

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

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

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

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

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

guest

回答3

0

投稿2023/05/19 03:37

Orlofsky

総合スコア16415

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

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

0

すでに回答がございますが、僕も考えてみましたので投稿させてください。
今回の課題に対しては目的からずれてしまい、必要なかったかもしれませんが…。

拝見した課題文で元のデータが「employee_no」を軸にしており、
集計目的のデータは「effective_date」が軸にしたいのではないかと推察しまして
カレンダー起点での集計でクエリを組んでみました。

カレンダー起点で集計することで、
保持しているデータセットの日時データの有無に左右されずにカレンダーの生成でき、
集計結果に日付の歯抜けが発生することを防ぐことができます。

何かのご参考になれば幸いです。

sql

1with cal as ( 2 select 3 DATE_ADD('2023-01-02', INTERVAL ROWNUM DAY) as effective_date 4 from ( 5 select 6 ROW_NUMBER() over(order by employee_no) as ROWNUM 7 from 8 employee 9 ) as r 10 order by effective_date 11 limit 3 /* カレンダーを「N」日間分と指定する */ 12) 13select 14 cal.effective_date 15 ,em.employee_no 16from 17 cal 18left join 19 employee 20 on cal.effective_date between employee.start_date and employee.end_date 21order by cal.effective_date, employee.employee_no 22;

投稿2023/05/19 02:27

166

総合スコア29

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

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

0

ベストアンサー

実現方法はさまざまあると思いますが、WITHによる再帰クエリを利用する方法が個人的にはもっともシンプルかと思います。

SQL

1WITH R (effective_date, end_date, employee_no) AS ( 2 SELECT start_date, end_date, employee_no FROM EMPLOYEE 3 UNION ALL 4 SELECT effective_date + INTERVAL '1' DAY, end_date, employee_no 5 FROM R 6 WHERE effective_date < end_date 7) 8SELECT effective_date, employee_no FROM R

以下は稼働確認に利用したDDLです。

SQL

1CREATE TABLE EMPLOYEE ( 2 employee_no CHAR(5) NOT NULL PRIMARY KEY, 3 start_date DATE NOT NULL, 4 end_date DATE NOT NULL 5); 6INSERT INTO EMPLOYEE VALUES ('11111', TO_DATE('2023/01/03', 'YYYY/MM/DD'), TO_DATE('2023/01/03', 'YYYY/MM/DD')); 7INSERT INTO EMPLOYEE VALUES ('22222', TO_DATE('2023/01/03', 'YYYY/MM/DD'), TO_DATE('2023/01/03', 'YYYY/MM/DD')); 8INSERT INTO EMPLOYEE VALUES ('33333', TO_DATE('2023/01/03', 'YYYY/MM/DD'), TO_DATE('2023/01/05', 'YYYY/MM/DD'));

投稿2023/05/19 01:32

neko_the_shadow

総合スコア2230

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問