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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Oracle

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

Q&A

解決済

2回答

1052閲覧

オラクルで取得したいデータのSQL文がわかりません

aaaccc

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Oracle

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

0グッド

0クリップ

投稿2020/08/18 08:15

編集2020/08/19 02:26

Access2019 VBAでオラクルDB(11g?)に接続しています。
取得したいデータのSQL文がわからず質問させてください。

・テーブルAにカラム「ID」、「区分」、「日付」があります。
・カラム「区分」は「開始」、「終了」があります。

テーブルA
ID 区分 日付
1  開始 2020/01/01
1  終了 2020/02/01
1  開始 2020/03/01
1  終了 2020/04/01
2  開始 2020/01/01
2  終了 2020/03/01
2  開始 2020/04/01

結果
ID 開始日    終了日
1  2020/01/01 2020/02/01
1  2020/03/01 2020/04/01
2  2020/01/01 2020/03/01
2  2020/04/01

※↑オラクルDBを参照する環境しかないのでSQL文は控させてください。

と「ID」「開始日」に対し直近の「終了日」を取得するSQL文はどうなるのでしょうか?

どうググるかわからず質問することにしました。。

↓なんとなく考えたSQL文です。最適かはわからなですが。。

SELECT  ID,  日付 開始日,  (SELECT    MIN(日付)   FROM    テーブルA   WHERE    区分 = '終了' AND A.日付 =< 日付 AND A.ID = ID  ) 終了日 FROM テーブルA A WHERE 区分 = '開始'

よろしくお願いいたします。

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

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

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

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

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

Orlofsky

2020/08/18 08:19

質問のテーブル定義はCREATE TABLE文に、テーブル中のデータはINSERT文に修正して https://teratail.com/help/question-tips#questionTips3-7 の [コード] で提示できると、動作確認し易くなるでの適切なコメントが付き易いです。Markdownの機能は覚えましょう。
m.ts10806

2020/08/18 08:34

まず、自身が思ったように書いてみてください。
aaaccc

2020/08/18 09:55

失礼しました。 明日、改めたいと思います。
guest

回答2

0

ベストアンサー

リンクテーブル経由ですか?それともパススルーですか?
検索のキーワードは「SQL 直近」で。
それに加え、リンクテーブルなら「Access」を、パススルーなら「oracle」をキーワードに加えて下さい。

access/oracleどちらでも大丈夫ですが、リンクテーブルで遅いようならパススリークエリーに変更した方が良いかと思います。

SQL

1select 開始.ID, 開始.日付 as 開始日, min(終了.日付) as 終了日 2from ( 3 select * from テーブルA where 区分='開始' 4 ) as 開始 5 left join ( 6 select * from テーブルA where 区分='終了' 7 ) as 終了 8 on 開始.ID = 終了.ID and 開始.日付 < 終了.日付 9group by 開始.ID, 開始.日付

oracleだと分析関数が使用できるので、lag()を使用すると以下の様な記述にもできます。

SQL

1select ID, 日付 as 開始日 2 , lag(日付) over(partition by ID order by 日付) as 終了日 3from テーブルA 4where 日付='開始'

投稿2020/08/18 09:59

編集2020/08/19 00:47
sazi

総合スコア25184

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

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

aaaccc

2020/08/28 05:33

解決しました。 個人的にわかりやすかったのでベストアンサーとさせていただきました。
guest

0

あまり美しくないですが・・・。

SQL

1SELECT 2 ID 3, START_DATE AS "開始日" 4, CASE WHEN MAX(END_DATE) < START_DATE THEN NULL ELSE MAX(END_DATE) END AS "終了日" 5FROM 6 ( 7 SELECT 8 ID 9 , MAX(DECODE("区分",'開始',"日付")) OVER (PARTITION BY ID ORDER BY "日付") START_DATE 10 , MAX(DECODE("区分",'終了',"日付")) OVER (PARTITION BY ID ORDER BY "日付") END_DATE 11 FROM 12 "テーブルA" 13 ) SUB 14GROUP BY 15 ID 16, START_DATE 17ORDER BY 18 ID 19, START_DATE

投稿2020/08/18 16:10

toyotaku

総合スコア103

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

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

aaaccc

2020/08/28 05:35

OVER句のあたりもっと勉強したいと思います。 素早い回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問