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

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

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

Apexは、Salesforce上で動作するアプリケーション作成をサポートするアプリケーション開発プラットフォーム。プログラミング言語であるApexコードと、独自のApex WebサービスAPIなどで構成されています。

Oracle

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

Q&A

解決済

3回答

5767閲覧

SQL ある範囲の月ごとのその月までの合計値の取得

rx5rra

総合スコア27

Apex

Apexは、Salesforce上で動作するアプリケーション作成をサポートするアプリケーション開発プラットフォーム。プログラミング言語であるApexコードと、独自のApex WebサービスAPIなどで構成されています。

Oracle

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

0グッド

0クリップ

投稿2017/08/23 06:14

編集2017/08/28 05:33

お世話になっております

Oracle12 SQLを使用して、ある月からその月までの残課題数の合計を月毎に取得するSQLを書きたいと考えているのですが、これはSQLのみで実現できますでしょうか?

具体的には、ある期間を『1月~3月』と指定したとすると

--データテーブル ID, 起票日 , 完了日 1, 2016/12/01, 2, 2017/01/01, 2017/01/02 3, 2017/02/01, 4, 2017/02/02, 5, 2017/02/01, 2017/03/01 6, 2017/03/01, 7, 2017/03/02, 2017/04/01 8, 2017/04/01,

というデータがあったとしますと、

月 , 残課題 2017/01, 0 2017/02, 3 2017/03, 4

この様に 1月は1月の、2月は1月2月の、3月は1月3月の結果を返すSQLを書きたいと考えております。

月が範囲ではなく、ひと月であればこのように書けるのですが、月の範囲が動的に変動する場合にどうすればいいのかがわかりません。
最初は、union all を使用して月ごとに取得しておりましたが、週毎などになるととてつもなく大変なので変えたいと思っております。

sql

1--1ヶ月前 2select to_char(add_months(current_date,-1),'YYYY/MM') month, count (ID) 残課題 3fromデータテーブル tbl 4where 5起票日 < to_date(last_day(add_months(to_char(current_date,'YYYY/MM/DD'),-1)))+1 6 and (完了月 > last_day(add_months(to_char(current_date,'YYYY/MM/DD'),-1)) or 完了日 is null)

また、PL/SQLを使用すればシンプルに実現可能だったりしますでしょうか?

※加筆修正しました

※解決したSQLを参考で記載しておきます。

sql

1with calendar 2 month 3) as ( 4 select to_char(sysdate -3, 'YYYY/MM') 5 from ( 6 select level lel from dual connect by level <= 3 7 ) 8) 9select cal.month month, ( 10 select count (*) 11 from TABLE tbl 12 where to_char(tbl.起票日,'YYYY/MM') <= cal.month 13 and ( 14 完了日 is null 15 or to_char(tbl.完了日, 'YYYY/MM') > cal.month 16 ) 17) 残課題 18from calendar cal 19order by month 20

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

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

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

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

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

alg

2017/08/23 06:49 編集

以下の情報が追記されると、回答が付きやすくなるかと思われます。  ①データが格納されているテーブルの定義(列名はわかりますが型が不明です。起票"日"なのに年月?)  ②「残課題」の定義(完了日が空であれば残課題とみなす?)
rx5rra

2017/08/23 07:32

ご指摘ありがとうございます。 質問を編集させて頂きました。
guest

回答3

0

ベストアンサー

月毎の集計を取りたい場合は、月の末日のみ登録してあるテーブルを用意しておくと便利です。
ここでは、eom_tableにeom(EndOfMonth)カラムがあるものとします。
未検証ですが、だいたいこんな感じで

SQL

1SELECT TO_CHAR(t1.eom, 'YYYY/MM') 年月, 2( 3 SELECT COUNT(1) 4 FROM "課題" 5 WHERE TO_CHAR(t1.eom, 'YYYY/MM') >= TO_CHAR("起票日", 'YYYY/MM') 6 AND ("完了日" IS NULL OR "完了日" > t1.eom) 7) 残課題 8FROM eom_table t1 9WHERE t1.eom > @date_from AND t1.eom <= @date_to

投稿2017/08/23 07:38

hihijiji

総合スコア4150

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

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

rx5rra

2017/08/28 05:36 編集

ありがとうございます。 回答を参考にwith句でカレンダーを作りサブクエリで問い合わせることで実現できました。 また、カレンダー用のテーブルは用意できませんでしたが、次回以降この様なシチュエーションがあった場合に、提案してみたいと思います。
guest

0

Oracle環境が無いのでcross joinnの書き方が違うかもしれませんのでご参考まで

sql

1select tb1.f1, sum(tb2.zan) from 2(select distinct f1 from hoge where f1 between '2017/01' and '2017/03') tb1 3cross join 4( select f1, 1 zan from hoge where f2 is null or f1!=f2 5 union all 6 select f2, -1 zan from hoge where f2 is not null) tb2 7where tb1.f1 >= tb2.f1 8group by tb1.f1 9order by tb1.f1 10;

投稿2017/08/23 07:30

編集2017/08/23 07:33
A.Ichi

総合スコア4070

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

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

rx5rra

2017/08/28 05:18

ありがとうございます。 質問が悪くて申し訳ありません。日付に対する件数ですのでcross joinを使うわけではありませんでした。 しかし、これはいつか使えそうなケースが出てきそうなので調べて覚えておきたいと思います。
A.Ichi

2017/08/28 05:36

postgreとmysqlでは上記結果が得られたので、Oracleもと思いましたが違う様ですね。お手数掛けてすみませんでした。
rx5rra

2017/08/28 06:42

誤解させてしまっていたら申し訳ありません、A.Ichi様のSQLは正しく動作しますが、(私の質問が悪かった為に)質問の内容に沿う内容では無かったというニュアンスです。 次回以降があれば、もっと簡潔にわかりやすく質問できるように気をつけたいと思います。
guest

0

「起票日」と「月」の相関関係がよくわかりませんが同じものを示しているなら
起票日でgroup byして、完了日がNULLでない(もしくは空でない)ものを
countすればよいのでは?

投稿2017/08/23 06:46

yambejp

総合スコア114784

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

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

rx5rra

2017/08/23 07:03

ありがとうございます 抜粋して書いたために、わかりにくくて申し訳ありませんが 1月なら1月から1月まで、2月なら1月から2月まで、3月なら1月から3月までの数をカウントしたかったのです。
yambejp

2017/08/23 07:11

ちなみに仕様について確認してよいでしょうか? 1月の残課題は完了日がすでにうまっているから0件なんですよね? 2月の残課題は埋まっていないのは2件ですが、命題だと3件になっています ロジックはどう判断すればよいでしょうか?(3月も同様)
ryuya_asami

2017/08/23 07:16

"NULL以外を数える"ではなく"NULLを数える"だからじゃないでしょうか? 残課題数なので、完了している物を数えたらダメな気が・・・
rx5rra

2017/08/23 07:30 編集

返信ありがとうございます。 2月の結果は、2月時点で、完了していない結果を出したいと考えております。 完了日は埋まっておりますが、3月となっているので2月時点ではしていないというニュアンスです。
rx5rra

2017/08/23 07:36

>ryuya_asami様 表現が悪くて申し訳ありません、2月は2月時点での、完了していない課題を取得したいと考えておりますので、nullを数えますと、翌月以降に完了したものもカウントされてしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問