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

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

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

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

Q&A

2回答

14253閲覧

select結果でレコード数を増やす方法を教えてください

kanbara

総合スコア13

Oracle

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

0グッド

0クリップ

投稿2018/03/12 16:40

下記のような元テーブルのデータから出力結果のような形で取得できるsqlを教えてください。可能であればパラメータで年度を受け取って年度の4月~3月のyyyyMMを動的に作るsqlだととても助かります。

データベースはoracle10gです。
不足している情報があれば追記します。

よろしくお願いします

元テーブル
store_cd | store_name

101 | a店
202 | b店
303 | c店

出力結果
yyyyMM | store_cd | store_name

201704 | 101 | a店
201705 | 101 | a店
201706 | 101 | a店
201707 | 101 | a店
201708 | 101 | a店
201709 | 101 | a店
201710 | 101 | a店
201711 | 101 | a店
201711 | 101 | a店
201712 | 101 | a店
201801 | 101 | a店
201802 | 101 | a店
201803 | 101 | a店
201704 | 202 | b店



201803 | 202 | b店
201704 | 303 | c店



201803 | 303 | c店

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

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

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

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

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

guest

回答2

0

キーの関連のないテーブルの全行どうしを結合するのにはNATURAL JOIN を使います。

準備

SQL

1CREATE TABLE STORE 2 ( 3 STORE_CD NUMBER(3) NOT NULL 4 , STORE_NAME VARCHAR2(6) NOT NULL 5 , CONSTRAINT PK_STORE PRIMARY KEY(STORE_CD) USING INDEX 6 ) ; 7INSERT INTO STORE(STORE_CD, STORE_NAME) VALUES(101, 'a店') ; 8INSERT INTO STORE(STORE_CD, STORE_NAME) VALUES(202, 'b店') ; 9INSERT INTO STORE(STORE_CD, STORE_NAME) VALUES(303, 'c店') ; 10COMMIT ;

WITH句を使わないSELECT

SQL

1SELECT 2 LY.YYYYMM 3 , S.STORE_CD 4 , S.STORE_NAME 5FROM( 6 SELECT 7 CASE 8 WHEN ROWNUM > 3 THEN 9 '2017' 10 ELSE 11 '2018' 12 END 13 || TO_CHAR(A.FROM_MM + ROWNUM - 1, 'FM00') AS YYYYMM 14 FROM( 15 SELECT 1 AS FROM_MM 16 , 12 AS TO_MM 17 FROM DUAL 18 ) A 19 CONNECT BY LEVEL <= A.TO_MM - A.FROM_MM + 1 20 ) LY 21NATURAL JOIN STORE S 22ORDER BY 23 S.STORE_CD 24 , LY.YYYYMM ;

WITH句を使ったSELECT

SQL

1WITH LIST_YYYYMM AS 2 ( 3 SELECT 4 CASE 5 WHEN ROWNUM > 3 THEN 6 '2017' 7 ELSE 8 '2018' 9 END 10 || TO_CHAR(A.FROM_MM + ROWNUM - 1, 'FM00') AS YYYYMM 11 FROM( 12 SELECT 1 AS FROM_MM 13 , 12 AS TO_MM 14 FROM DUAL 15 ) A 16 CONNECT BY LEVEL <= A.TO_MM - A.FROM_MM + 1 17 ) 18SELECT 19 LY.YYYYMM 20 , S.STORE_CD 21 , S.STORE_NAME 22FROM LIST_YYYYMM LY 23NATURAL JOIN STORE S 24ORDER BY 25 S.STORE_CD 26 , LY.YYYYMM ;

次のSQLの質問からSTOREテーブルのCREATE TABLE文とINSERT文くらいは提示してね。

投稿2018/03/12 17:31

編集2018/03/13 19:44
Orlofsky

総合スコア16415

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

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

0

12カ月分のリストをconnect byを利用して作成し、それを基準の月(前年度末月)に**add_months()**を使用して加算する。
上記による、年度月のリストと対象のテーブルを直積(cross join)することによって、結果を求めます。
※パラメータになる部分は下記例だと'2017'の部分。

SQL

1with 2 param as ( 3 select to_date('2017' || '03', 'yyyymm') as base_month from dual 4 ) 5, fisical_year_list as ( 6 select add_months(param.base_month, range.seq) yyyymm 7 from param cross join 8 (select level AS seq FROM dual connect by level <= 12) range 9 ) 10 select * from fisical_year_list cross join STORE 11 order by store_cd, yyyymm

投稿2018/03/13 06:14

sazi

総合スコア25206

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問