質問編集履歴

2

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

2017/08/28 05:33

投稿

rx5rra
rx5rra

スコア27

test CHANGED
File without changes
test CHANGED
@@ -87,3 +87,51 @@
87
87
 
88
88
 
89
89
  ※加筆修正しました
90
+
91
+
92
+
93
+ ※解決したSQLを参考で記載しておきます。
94
+
95
+ ```sql
96
+
97
+ with calendar
98
+
99
+ month
100
+
101
+ ) as (
102
+
103
+ select to_char(sysdate -3, 'YYYY/MM')
104
+
105
+ from (
106
+
107
+ select level lel from dual connect by level <= 3
108
+
109
+ )
110
+
111
+ )
112
+
113
+ select cal.month month, (
114
+
115
+ select count (*)
116
+
117
+ from TABLE tbl
118
+
119
+ where to_char(tbl.起票日,'YYYY/MM') <= cal.month
120
+
121
+ and (
122
+
123
+ 完了日 is null
124
+
125
+ or to_char(tbl.完了日, 'YYYY/MM') > cal.month
126
+
127
+ )
128
+
129
+ ) 残課題
130
+
131
+ from calendar cal
132
+
133
+ order by month
134
+
135
+
136
+
137
+ ```

1

ご指摘に関して

2017/08/28 05:33

投稿

rx5rra
rx5rra

スコア27

test CHANGED
File without changes
test CHANGED
@@ -6,27 +6,35 @@
6
6
 
7
7
 
8
8
 
9
+
10
+
9
- 具体的には、期間を『2017/01 ~ 2017/03』とすると
11
+ 具体的には、ある期間を『1月~3』と指定したとすると
12
+
13
+
14
+
15
+
10
16
 
11
17
  ```
12
18
 
13
- ID, 起票日 , 完了日,
19
+ --データテーブル
14
20
 
15
- 1, 2016/12,
21
+ ID, 起票日 , 完了日
16
22
 
17
- 2, 2017/01, 2017/01
23
+ 1, 2016/12/01,
18
24
 
19
- 3, 2017/02,
25
+ 2, 2017/01/01, 2017/01/02
20
26
 
21
- 4, 2017/02,
27
+ 3, 2017/02/01,
22
28
 
23
- 5, 2017/02, 2017/03
29
+ 4, 2017/02/02,
24
30
 
25
- 6, 2017/03,
31
+ 5, 2017/02/01, 2017/03/01
26
32
 
27
- 7, 2017/03, 2017/04
33
+ 6, 2017/03/01,
28
34
 
35
+ 7, 2017/03/02, 2017/04/01
36
+
29
- 8, 2017/04,
37
+ 8, 2017/04/01,
30
38
 
31
39
  ```
32
40
 
@@ -44,30 +52,38 @@
44
52
 
45
53
  ```
46
54
 
47
- この様結果を返すSQLを書きたいと考えております。
55
+ この様に 1月は1月の、2月は1月~2月の、3月は1月~3月の結果を返すSQLを書きたいと考えております。
48
56
 
49
57
 
50
58
 
51
- sqlイメージとししては、
59
+ 月が範囲ではなく、ひと月であればこように書けるのですが、月の範囲が動的に変動する場合にどうすればいいのかがわかりせん。
52
60
 
53
- ```sql
61
+ 最初は、union all を使用して月ごとに取得しておりましたが、週毎などになるととてつもなく大変なので変えたいと思っております。
54
62
 
55
- select サブクエリ結果の月, count (サブクエリ結果のID)
63
+ ```sql
56
64
 
57
- from (
65
+ --1ヶ月前
58
66
 
59
- 月とIDが返る問い合わせ結果?
67
+ select to_char(add_months(current_date,-1),'YYYY/MM') month, count (ID) 残課題
60
68
 
61
- )
69
+ fromデータテーブル tbl
62
70
 
63
- group by 月
71
+ where
72
+
73
+ 起票日 < to_date(last_day(add_months(to_char(current_date,'YYYY/MM/DD'),-1)))+1
74
+
75
+ and (完了月 > last_day(add_months(to_char(current_date,'YYYY/MM/DD'),-1)) or 完了日 is null)
64
76
 
65
77
  ```
66
78
 
67
- の様なものを想像しているのですが、月の範囲がその都度変わる為苦戦しております。
68
79
 
69
- 最初は、union all を使用して月ごとに取得しておりましたが、週毎などになるととてつもなく大変なので変えたいと思っております。
80
+
81
+
70
82
 
71
83
 
72
84
 
73
85
  また、PL/SQLを使用すればシンプルに実現可能だったりしますでしょうか?
86
+
87
+
88
+
89
+ ※加筆修正しました