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

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

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

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

Q&A

解決済

2回答

386閲覧

Oracle11gの分析関数を駆使して、SELECT文を一度で済ませたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

0グッド

0クリップ

投稿2019/06/13 01:25

編集2019/06/13 03:09

#Oracle11gでのSELECT文に関する質問です。

下記のような店舗マスタがあります。
店舗の廃止がありますし、店舗コードが同じでも店舗名が変わります。
適用日単位でまとめられています。

店舗コード店舗名適用日
1A店2019/06/01
2B店2019/06/01
3C店2019/06/01
1A1店2019/09/01
2B1店2019/09/01
4D1店2019/09/01
1A2店2019/10/01
2B2店2019/10/01
5E2店2019/10/01

例えば、2019/06/01時点で存在するのは、「A店、B店、C店」です。
2019/07/01時点で存在するのも、「A店、B店、C店」です。
2019/09/01時点で存在するのは、「A1店、B1店、D1店」です。「C店」は廃止です。
2019/10/01時点で存在するのは、「A2店、B2店、E2店」です。「D1店」は廃止です。

このテーブル、適用終了日列が定義されていれば簡単なんですが。。。
指定した日付を範囲指定しての店舗を取得するのに苦労しています。
例えば、2019/08/30~2019/09/01の期間に存在する店舗(店舗名込み)を、出来るだけ完結なSQLで記述したいです。
分析関数とか駆使すれば、一度に取得できるんでしょうが、どう組むべきかわからずです。

######取得したい結果

検索日付店舗コード店舗名適用日
2019/08/301A店2019/06/01
2019/08/302B店2019/06/01
2019/08/303C店2019/06/01
2019/08/311A店2019/06/01
2019/08/312B店2019/06/01
2019/08/313C店2019/06/01
2019/09/011A1店2019/09/01
2019/09/012B1店2019/09/01
2019/09/014D1店2019/09/01

#create、insert文

sql

1CREATE TABLE M_SHOP 2( 3 SHOP_ID NUMBER(3,0) NOT NULL, 4 SHOP_NAME VARCHAR2(60) NOT NULL, 5 APLY_DATE VARCHAR2(8) NOT NULL 6); 7 8 9insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (1,'A店','20190601'); 10insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (2,'B店','20190601'); 11insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (3,'C店','20190601'); 12insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (1,'A1店','20190901'); 13insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (2,'B1店','20190901'); 14insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (4,'D1店','20190901'); 15insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (1,'A2店','20191001'); 16insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (2,'B2店','20191001'); 17insert into M_SHOP(SHOP_ID,SHOP_NAME,APLY_DATE) values (5,'E2店','20191001'); 18

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

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

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

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

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

Orlofsky

2019/06/13 02:38

この手の質問では、CREATE TABLE文でテーブルの定義、サンプルデータのINSERT文を提示してくれると手元の環境でサクッと試して確度の高い回答を提示できますが、それがないと、質問のテーブル情報からCREATE TABLE と INSERT を作る必要があります。 最初からCREATE TABLE文とINSERT文を提示するとコメントが付きやすいです。
退会済みユーザー

退会済みユーザー

2019/06/13 03:10

申し訳ありません。回答者への配慮不足でした。 追記しました。
guest

回答2

0

このテーブル、適用終了日列が定義されていれば簡単なんですが。。。

SQL

1select * 2 , coalesce(to_char(to_date(lead(APLY_DATE) over(partition by SHOP_ID order by APLY_DATE), 'yyyymmdd') -1, 'yyyymmdd'), '99991231') as 適用終了日 3from M_SHOP

最終のデータに関しての適用終了日は9999/12/31としています。文字型なので99999999とした方が良いかもしれません。
分析関数:ランキング、LEAD/LAG、レポート

投稿2019/06/13 15:18

編集2019/06/13 15:34
sazi

総合スコア25138

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

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

0

ベストアンサー

手元にOracle環境がないため未検証です。
WITH句はOracle限定:SQLだけでカレンダー出力 - Qiitaを丸々利用しています。

SQL

1with T1 as ( 2 SELECT 3 start_date + ROWNUM -1 calendar 4 FROM ( 5 SELECT 6 TRUNC( 7 TO_DATE('20190830','YYYYMMDD') -- 表示開始の年月日を指定 8 ) start_date, 9 3 days -- 表示したい日数を指定 10 FROM 11 DUAL 12 ) ,ALL_CATALOG -- 表示したい日数分の行数があるテーブルを指定 = ROUNUMで利用 13 WHERE 14 ROWNUM <= days 15) 16select T1.*, M_SHOP.* 17from T1, M_SHOP 18where APLY_DATE = ( 19 select MAX(APLY_DATE) 20 from M_SHOP 21 where APLY_DATE <= to_char(T1.calendar, 'YYYYMMDD') 22) 23order by T1.calendar, M_SHOP.SHOP_ID 24;

投稿2019/06/13 12:20

.Y_Y.

総合スコア42

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

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

退会済みユーザー

退会済みユーザー

2019/06/14 05:30

望む結果が取得できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問