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

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

ただいまの
回答率

87.92%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,642

score 48

前提・実現したいこと

商品名 開始日 終了日 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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kpiyohiko

    2016/12/15 12:52

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

    キャンセル

  • shoota

    2016/12/15 12:54

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

    キャンセル

回答 2

checkベストアンサー

+1

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

WITH rec_test(name, sdate, edate, quantity) AS (
    SELECT
        t.name
    ,   t.sdate 
    ,   t.edate 
    ,   t.quantity
    FROM
        test t
    UNION ALL
    SELECT
        r.name
    ,   r.sdate + 1 AS sdate
    ,   r.edate 
    ,   r.quantity
    FROM
        rec_test r
    WHERE
        r.edate > r.sdate
)
SELECT
    name AS "商品名"
,   sdate AS "使用日"
,   quantity AS "個数"
FROM
    rec_test
ORDER BY
    "商品名"
,   "使用日"

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/15 19:10

    元質問者は解決できたようなので無視して良いです。

    8行目
    test t

    rec_test t
    に修正して実行すると、
    rec_test r
    *
    行16でエラーが発生しました。:
    ORA-32043: 再帰的WITH句には初期化ブランチが必要です

    となります。

    キャンセル

  • 2016/12/15 19: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向けに組み直したので、
    他でもしくってるかもしれませんが・・・^^;

    キャンセル

0

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

sqlplusで連続した日付は

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YY/MM/DD' ;

セッションが変更されました。

SQL> SELECT A.DATE_FROM + ROWNUM - 1 AS DATES
  2  FROM(
  3      SELECT TO_DATE('16/10/01', 'YY/MM/DD') AS DATE_FROM
  4           , TO_DATE('16/10/03', 'YY/MM/DD') AS DATE_TO
  5      FROM DUAL
  6      ) A
  7  CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1 ;

DATES
--------
16/10/01
16/10/02
16/10/03

SQL>


で取得できます。

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

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

SHOHIN_MEI   DATES             KOSU
------------ -------- -------------
鉛筆         16/10/01             2
鉛筆         16/10/02             2
鉛筆         16/10/03             2

SQL>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る