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

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

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

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

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回答

7350閲覧

ORACLE SQLで期間で出ているデータを、1日毎にしたい

tamago83

総合スコア60

Oracle

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

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クリップ

投稿2016/12/15 03:46

編集2016/12/15 04:39

###前提・実現したいこと
|商品名|開始日|終了日|1日個数|
|:=:|:=:|:=:|:=:|
|鉛筆|16/10/01|16/10/03|2|
|消しゴム|16/10/02|16/10/05|3|
|ボールペン|16/10/01|16/10/02|1|

上のテーブルを、下のような一日毎に分解したいのですが、sqlのみで可能でしょうか?
|商品名|使用日|個数|
|:=:|:=:|:=:|
|鉛筆|16/10/01|2|
|鉛筆|16/10/02|2|
|鉛筆|16/10/03|2|
|消しゴム|16/10/02|3|
|消しゴム|16/10/03|3|
|消しゴム|16/10/04|3|
|消しゴム|16/10/05|3|
|ボールペン|16/10/01|1|
|ボールペン|16/10/02|1|

###補足情報
DB:oracle 11g

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

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

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

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

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

kpiyohiko

2016/12/15 03:52

もともとはどのように格納されていますか?
shoota

2016/12/15 03:54

ボールペンだけ1日分のデータになっているのは質問ミスですかね?
guest

回答2

0

ベストアンサー

Oracle 11gなら再帰的なWITH句が利用できたはず・・・
検証できてないですが以下のようなイメージでいけるのではないかと。

SQL

1WITH rec_test(name, sdate, edate, quantity) AS ( 2 SELECT 3 t.name 4 , t.sdate 5 , t.edate 6 , t.quantity 7 FROM 8 test t 9 UNION ALL 10 SELECT 11 r.name 12 , r.sdate + 1 AS sdate 13 , r.edate 14 , r.quantity 15 FROM 16 rec_test r 17 WHERE 18 r.edate > r.sdate 19) 20SELECT 21 name AS "商品名" 22, sdate AS "使用日" 23, quantity AS "個数" 24FROM 25 rec_test 26ORDER BY 27 "商品名" 28, "使用日"

即興で作ったサンプルなので、
カラム名とかは読み替えて下さいね。

あと開始日、終了日にNULLが入る場合は要注意です。

投稿2016/12/15 04:48

Panzer_vor

総合スコア1636

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

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

Orlofsky

2016/12/15 10:10

元質問者は解決できたようなので無視して良いです。 8行目 test t を rec_test t に修正して実行すると、 rec_test r * 行16でエラーが発生しました。: ORA-32043: 再帰的WITH句には初期化ブランチが必要です となります。
Panzer_vor

2016/12/15 10:34

> Orlofskyさん ご指摘ありがとうございます。 情報の提示不足でしたね。 WITH句内の最初のSELECT句の「test」は、 質問者様が提示されたデータを基に作成した下記のような実テーブルだったりします。 CREATE TABLE test2 ( name character varying(10) not null , sdate date , edate date , quantity integer , primary key (name) ); なので、そこはrec_testを指定しないで正しいです、紛らわしくてすみません。 ただPostgreSQLからOracle向けに組み直したので、 他でもしくってるかもしれませんが・・・^^;
guest

0

質問の際は、CREATE TABLE, INSERT も載せると回答が付きやすいです。

sqlplusで連続した日付は

SQL

1SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YY/MM/DD' ; 2 3セッションが変更されました。 4 5SQL> SELECT A.DATE_FROM + ROWNUM - 1 AS DATES 6 2 FROM( 7 3 SELECT TO_DATE('16/10/01', 'YY/MM/DD') AS DATE_FROM 8 4 , TO_DATE('16/10/03', 'YY/MM/DD') AS DATE_TO 9 5 FROM DUAL 10 6 ) A 11 7 CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1 ; 12 13DATES 14-------- 1516/10/01 1616/10/02 1716/10/03 18 19SQL>

で取得できます。

時間がないので、とりあえず鉛筆だけ。

SQL

1SQL> WITH SHOHIN_LIST AS 2 2 ( 3 3 SELECT '鉛筆' AS SHOHIN_MEI, TO_DATE('16/10/01', 'YY/MM/DD') AS D 4ATE_FROM, TO_DATE('16/10/03', 'YY/MM/DD') AS DATE_TO, 2 AS KOSU FROM DUAL 5 4 ) 6 5 SELECT A.SHOHIN_MEI 7 6 , A.DATE_FROM + ROWNUM - 1 AS DATES 8 7 , A.KOSU 9 8 FROM( 10 9 SELECT SL.SHOHIN_MEI 11 10 , SL.DATE_FROM 12 11 , SL.DATE_TO 13 12 , SL.KOSU 14 13 FROM SHOHIN_LIST SL 15 14 ) A 16 15 CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1 ; 17 18SHOHIN_MEI DATES KOSU 19------------ -------- ------------- 20鉛筆 16/10/01 2 21鉛筆 16/10/02 2 22鉛筆 16/10/03 2 23 24SQL>

投稿2016/12/15 04:41

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問