お世話になっております
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
回答3件
あなたの回答
tips
プレビュー