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

質問編集履歴

2

解決したコードを参考に記載。

2017/08/28 05:33

投稿

rx5rra
rx5rra

スコア27

title CHANGED
File without changes
body CHANGED
@@ -42,4 +42,28 @@
42
42
 
43
43
  また、PL/SQLを使用すればシンプルに実現可能だったりしますでしょうか?
44
44
 
45
- ※加筆修正しました
45
+ ※加筆修正しました
46
+
47
+ ※解決したSQLを参考で記載しておきます。
48
+ ```sql
49
+ with calendar
50
+ month
51
+ ) as (
52
+ select to_char(sysdate -3, 'YYYY/MM')
53
+ from (
54
+ select level lel from dual connect by level <= 3
55
+ )
56
+ )
57
+ select cal.month month, (
58
+ select count (*)
59
+ from TABLE tbl
60
+ where to_char(tbl.起票日,'YYYY/MM') <= cal.month
61
+ and (
62
+ 完了日 is null
63
+ or to_char(tbl.完了日, 'YYYY/MM') > cal.month
64
+ )
65
+ ) 残課題
66
+ from calendar cal
67
+ order by month
68
+
69
+ ```

1

ご指摘に関して

2017/08/28 05:33

投稿

rx5rra
rx5rra

スコア27

title CHANGED
File without changes
body CHANGED
@@ -2,17 +2,21 @@
2
2
 
3
3
  Oracle12 SQLを使用して、ある月からその月までの残課題数の合計を月毎に取得するSQLを書きたいと考えているのですが、これはSQLのみで実現できますでしょうか?
4
4
 
5
+
5
- 具体的には、期間を『2017/01 ~ 2017/03』とすると
6
+ 具体的には、ある期間を『1月~3月』と指定したとすると
7
+
8
+
6
9
  ```
10
+ --データテーブル
7
- ID, 起票日 , 完了日,
11
+ ID, 起票日 , 完了日
8
- 1, 2016/12,
12
+ 1, 2016/12/01,
13
+ 2, 2017/01/01, 2017/01/02
9
- 2, 2017/01, 2017/01
14
+ 3, 2017/02/01,
10
- 3, 2017/02,
11
- 4, 2017/02,
12
- 5, 2017/02, 2017/03
15
+ 4, 2017/02/02,
13
- 6, 2017/03,
16
+ 5, 2017/02/01, 2017/03/01
14
- 7, 2017/03, 2017/04
17
+ 6, 2017/03/01,
18
+ 7, 2017/03/02, 2017/04/01
15
- 8, 2017/04,
19
+ 8, 2017/04/01,
16
20
  ```
17
21
  というデータがあったとしますと、
18
22
  ```
@@ -21,17 +25,21 @@
21
25
  2017/02, 3
22
26
  2017/03, 4
23
27
  ```
24
- この様結果を返すSQLを書きたいと考えております。
28
+ この様に 1月は1月の、2月は1月~2月の、3月は1月~3月の結果を返すSQLを書きたいと考えております。
25
29
 
30
+ 月が範囲ではなく、ひと月であればこのように書けるのですが、月の範囲が動的に変動する場合にどうすればいいのかがわかりません。
26
- sqlのイメージとしましては
31
+ 最初は、union all を使用して月ごに取得ておりましたが週毎などになるととてつもなく大変なので変えたいと思っております。
27
- ```sql
32
+ ```sql
33
+ --1ヶ月前
28
- select サブクエリ結果の月, count (サブクエリ結果のID)
34
+ select to_char(add_months(current_date,-1),'YYYY/MM') month, count (ID) 残課題
29
- from (
35
+ fromデータテーブル tbl
30
- 月とIDが返る問い合わせ結果?
31
- )
32
- group by 月
36
+ where
37
+ 起票日 < to_date(last_day(add_months(to_char(current_date,'YYYY/MM/DD'),-1)))+1
38
+ and (完了月 > last_day(add_months(to_char(current_date,'YYYY/MM/DD'),-1)) or 完了日 is null)
33
39
  ```
34
- の様なものを想像しているのですが、月の範囲がその都度変わる為苦戦しております。
35
- 最初は、union all を使用して月ごとに取得しておりましたが、週毎などになるととてつもなく大変なので変えたいと思っております。
36
40
 
41
+
42
+
37
- また、PL/SQLを使用すればシンプルに実現可能だったりしますでしょうか?
43
+ また、PL/SQLを使用すればシンプルに実現可能だったりしますでしょうか?
44
+
45
+ ※加筆修正しました