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

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

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

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

Amazon Redshift

Amazon Redshiftは、Amazon社が提供する 高速かつ完全マネージド型でペタバイト規模の クラウドデータウェアハウスサービスです。

Q&A

解決済

3回答

4353閲覧

3ヶ月以内の値を集計し、出力したい

Toshi_1995

総合スコア40

SQL

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

Amazon Redshift

Amazon Redshiftは、Amazon社が提供する 高速かつ完全マネージド型でペタバイト規模の クラウドデータウェアハウスサービスです。

0グッド

0クリップ

投稿2019/08/23 02:15

編集2019/08/23 02:33

やりたい事

下記のテーブルから、当月を含める当月以降3ヶ月以内のvalueを集計し、出力したいです。
periodが201901の場合、201901~201903のvalueの合計値を求めて出力したいです。

value_table

idperiodvalue
12019011
12019022
12019032
12019055
22019012
22019023
22019041

求める出力結果

idperiodvalue
12019015
12019024
12019037
12019055
22019015
22019024
22019041

テーブル

CREATE TABLE value_table ( id VARCHAR(9999) , period VARCHAR(9999) , value VARCHAR(9999) );

求める出力結果が出せず苦戦しております。
アドバイス等ご教示頂けると幸いです。
お手数ですが、宜しくお願い致します。

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

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

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

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

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

yambejp

2019/08/23 02:24

> 当月を含める3ヶ月以内 当月をおよび当月以降3ヶ月以内?(当月より後ということ) > 201901のレコードに格納し 検索・集計するのではなく、上書きしちゃうんですか? 先に201903が7に上書きされてしまうと、 201902は9になり、201901は17になってしまいますが 古い日付から順に処理するのでしょうか?
Orlofsky

2019/08/23 02:25

> valueを集計 なのに、テーブル設計の > value VARCHAR(9999) って文字型なの?
Toshi_1995

2019/08/23 02:35

yambejpさん >当月をおよび当月以降3ヶ月以内?(当月より後ということ) 申し訳ございません。 当月を含める当月以降3ヶ月以内です。 >検索・集計するのではなく、上書きしちゃうんですか? 失礼致しました。 上書きではなく、検索・集計です。
Toshi_1995

2019/08/23 02:40

Orlofskyさん 全てVARCHARで設定しております。
Orlofsky

2019/08/23 02:53

数値型にしないと使いにくいのでは? SQLの経験がないのでしょうか?
guest

回答3

0

ベストアンサー

SQLの方言は適宜読み替えてください
periodは日付型にしないと年が変わったときに対応が難しいです
valueも集計するなら数値型がよいでしょう

SQL

1CREATE TABLE value_table ( 2 id int, 3 period date, 4 value int 5); 6 7insert into value_table values 8(1,'2019-01-01',1), 9(1,'2019-02-01',2), 10(1,'2019-03-01',2), 11(1,'2019-05-01',5), 12(2,'2019-01-01',2), 13(2,'2019-02-01',3), 14(2,'2019-04-01',1); 15 16select id,period, 17(select sum(value) 18from value_table 19where id=t1.id 20and period between t1.period and t1.period+interval 2 month) 21as vals 22from value_table as t1

投稿2019/08/23 02:57

yambejp

総合スコア114843

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

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

Toshi_1995

2019/08/23 07:12

ご指摘ありがとうございます。 上記のSQLで期待通りの結果が得られました。 今後は型も気をつけます。 ありがとうございました!
guest

0

相関サブクエリーでの集計

SQL

1select id, period 2 , (select sum(cast(value as integer)) from value_table 3 where id=t.id 4 and period between t.period and to_char(dateadd(RM, 2, to_date(t.period, 'YYYYMM')), 'YYYYMM') 5 ) as value 6from value_table t 7

TO_DATE
TO_CHAR
日時形式の文字列
DATEADD 関数

投稿2019/08/23 02:45

編集2019/08/23 02:48
sazi

総合スコア25195

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

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

Toshi_1995

2019/08/23 07:14

>saziさん 回答ありがとうございました! 日付の列はdate型にしないと変換が大変なので、今後は気をつけたいと思います。
guest

0

DATE_ADD等でで1日後と結合すればいいんじゃないでしょうか。
そしてそれぞれを足してみればいいのではないでしょうか。

投稿2019/08/23 02:32

ababa_Sigrun

総合スコア279

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問