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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

3回答

2034閲覧

定期的に累計データを出すSQLの書き方について

TakefusaBoku

総合スコア41

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/05/10 13:27

SQL(Oracle11g)を使って毎月定期的にあるデータの累計を集計する作業をしています。
これが意外と時間が掛かるのである程度自動的にファイル作成をしたいのですが、
SQL文の書き方についてどなたかご教示頂けないでしょうか?
例えば4月になったら1~3月の累計、5月になったら1~4月の累計を出すのです
今は1つのSQL文を毎回毎回書き換えてファイルに手で追記しています。
初心者ですみませんが、よろしくお願い致します。

<データベース>
日付 系統 教科 点数
2016/01/01 文系 国語 70
2016/01/01 文系 社会 50
2016/01/01 理系 化学 60
2016/01/02 文系 古文 80
2016/01/03 文系 国語 80
2016/01/03 理系 数学 50
2016/01/04 理系 物理 50
2016/01/04 理系 化学 90
2016/01/04 文系 国語 80
2016/01/04 文系 国語 80
2016/01/05 理系 数学 99



2016/05/05 文系 古文 30


延々と続く

<集計されたファイルのデータ>
2016/01 文系 国語 310
2016/01 文系 社会 50
2016/01 理系 化学 150



2016/02 理系 物理 500
2016/02 文系 現文 160


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

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

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

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

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

guest

回答3

0

ベストアンサー

こちらも1例として。
前月末はLAST_DAY関数とADD_MONTHS関数を使っても取得できます。

SQL

1SELECT 2 TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,-1)),'YYYY/MM/DD') 3FROM 4 DUAL 5;

投稿2016/05/11 07:43

編集2016/05/11 07:44
Tommy.103

総合スコア94

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

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

TakefusaBoku

2016/05/15 14:58

ありがとうございます。 大変参考になりました。
guest

0

一例ですが。
翌月に2016/1/1から前月末日の23:59:59までを集計するとして
後ろの部分のみを固定するとこんな感じにします。
trunc(sysdate,'MM')部分は、現在時刻で実行すると
2016/5/1 00:00:00となります。

SQL

1SELECT item1, item2 2FROM TABLE1 3WHERE target_date between to_date('20160101','YYYYMMDD') and trunc(sysdate,'MM') -1/86400;

投稿2016/05/11 06:13

yodel

総合スコア508

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

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

TakefusaBoku

2016/05/15 14:58

ありがとうございます。 大変参考になりました。
guest

0

sysdate関数をwhere句に用いてみるのはいかがでしょうか。
以下のように実行すると「yyyy/mm/dd」形式の現在日付が取得できます。

SQL

1select 2 to_char(sysdate,'yyyy/mm/dd') 3from dual;

1月1日に関しては、「to_char(sysdate, 'yyyy')||'01/01'」のように指定し、
終了日付に関しては「to_char(sysdate, 'yyyy/mm')||'/01'」のように指定し未満として範囲指定すれば固定SQLで希望のデータ取得が行えるかと思います。

※データ量にもよりますが、速度は遅いSQLです。。。

投稿2016/05/10 16:19

takyafumin

総合スコア2335

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

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

TakefusaBoku

2016/05/15 14:58

ありがとうございます。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問