teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

SQL

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

Q&A

解決済

3回答

1010閲覧

SSQLサマリーの求め方

yamaguti

総合スコア185

Oracle

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

SQL

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

1グッド

1クリップ

投稿2019/12/09 02:43

編集2019/12/09 05:32

1

1

CREATE

1create table 売上ロット 2( 3cd varchar2(10) 4,LOT varchar2(10) 5,最古売上月 varchar2(10) 6) 7; 8create table 売上トラン 9( 10cd varchar2(10) 11,売上額 number 12,売上日 varchar2(10) 13) 14;

INSERT

1insert into 売上ロット values('123','D1','2019/01/01'); 2insert into 売上ロット values('123','D2','2019/02/01'); 3insert into 売上ロット values('123','D3','2019/03/01'); 4insert into 売上トラン values('123',30,'2019/01/01'); 5insert into 売上トラン values('123',10,'2019/01/06'); 6insert into 売上トラン values('123',120,'2019/03/01'); 7commit;

売上ロット
CD LOT 最古売上月
-------+-------+-------
123 D1 2019/01/01
123 D2 2019/02/01
123 D3 2019/03/01

売上トラン
CD 売上額 売上日
-------+-------+-------
123 30 2019/01/01
123 10 2019/01/06
123 120 2019/03/01

上記2つのテーブルの情報から、下記のような情報を得たい

CD LOT 最古売月 売上金額
-------+-------+----------+-------
123 D1 2019/01 40
123 D2 2019/02 0
123 D3 2019/03 120

最古売上日間をSUMすればいいのですが、単純なSQLでは実現できないでしょうか。
plsqlでcursorに入れるという形であればできると思いますが、単一SQLで実現できる方法があれば
教えて頂けませんでしょうか。

下記のようなSQLを売上日を変えて、UNIONでつなげれば、もとまるとは思いますが
1920/01/01~2019/12/01をすべて求める必要があり、すべてパラメータを変えるのは難しい状態です。

SQL

1select t1.cd,t1.lot,SUBSTR(売上日,1,7)||'/01',sum(t2.売上額) from 売上ロット t1 2left join 売上トラン t2 3on t1.cd = t2.cd 4where 売上日 > = '2019/01/01' 5and 売上日 < '2019/02/01' 6group by t1.cd,t1.lot,SUBSTR(売上日,1,7)||'/01'
yodel👍を押しています

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

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

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

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

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

Orlofsky

2019/12/09 03:18

データ型によってSQLの書き方が違いますので、最初から質問にCREATE TABLE を追記しては?
Orlofsky

2019/12/09 04:00

データもINSERTにしては?
yamaguti

2019/12/09 04:09

追記しました。
Orlofsky

2019/12/09 05:11

追記ではなく修正してください。Markdownのhttps://teratail.com/help/question-tips#questionTips3-7 の [コード] で載せてください。
yamaguti

2019/12/09 05:27

修正しました。
Orlofsky

2019/12/09 05:35

最初のテーブル定義でSELECTするデータの提示は削除しては?
yamaguti

2019/12/09 05:47

最初のテーブル定義でSELECTするデータの提示は削除しては? →申し訳ございません。どういう意味でしょうか。
yodel

2019/12/09 09:13

結局どこが分からなくてつまづいていたのでしょうか?
guest

回答3

0

ベストアンサー

ちょっとやってみました。

SQL

1SELECT 2 T1.CD 3, T1.LOT 4, T1.最古売上月 5, NVL(SUM(T2.売上額), 0) 売上金額 6FROM 7 ( 8 SELECT 9 CD 10 , LOT 11 , 最古売上月 12 , LEAD(最古売上月, 1, '9999/99/99') 13 OVER(PARTITION BY CD 14 ORDER BY 最古売上月) AS 終了日 15 FROM 16 売上ロット 17 ) T1 18 LEFT JOIN 19 売上トラン T2 20 ON T2.CD = T1.CD 21 AND T2.売上日 >= T1.最古売上月 22 AND T2.売上日 < T1.終了日 23GROUP BY 24 T1.CD 25, T1.LOT 26, T1.最古売上月 27ORDER BY 28 T1.CD 29, T1.LOT 30, T1.最古売上月

投稿2019/12/09 07:30

KOZ6.0

総合スコア2736

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

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

yamaguti

2019/12/09 07:47

ありがとうございました。解決しました。
guest

0

売上ロットに対してウインドウ関数の**lag()**を用いて期間の範囲を作成し、その範囲での集計をとれば良いかと思います。

SQL

1select CD, LOT, substr(最古売上月, 1, 7) 最古売上, sum(t2.売上額) 2from ( 3 select CD, LOT, 最古売上月 4 , lag(最古売上月, 1, '0000/00/00') 5 over(partiton by cd, lot order by 最古売上月) 6 lag_最古売上月 7 from 売上ロット 8 ) t1 9 left join 売上トラン 10 on t1.CD=t2.CD and t1.lag_最古売上月 < t2.売上日 and t2.売上日 <= t1.最古売上月 11group by CD, LOT, substr(最古売上月, 1, 7)

投稿2019/12/09 06:47

編集2019/12/09 06:54
sazi

総合スコア25430

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

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

yamaguti

2019/12/09 07:47

ありがとうございました。解決しました。
sazi

2019/12/09 08:53

最古売上だからlead()の方でしたね。
guest

0

ヒントで
trunc は日付型か数値型に使います。文字型から一部の文字列を取得するのは substr です。SQL言語リファレンスを確認してください。

可能であれば、最古売上月や売上日はdate型にした方がデータにあり得ない日付が入ってしまって想定外の結果になるなど無用なトラブルが少ないです。

投稿2019/12/09 05:17

Orlofsky

総合スコア16419

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

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

yamaguti

2019/12/09 05:33

承知しました。 テーブル定義は変更できない為、SQLを修正致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問