我需要编写一个报告,该报告针对具有每个记录的日期范围的表生成汇总总数。
table data: option start_date end_date opt1 6/12/2009 6/19/2009 opt1 6/3/2009 6/13/2009 opt2 6/5/2009 6/6/2009
我想要的基本上是这样的:
date option count 6/1/2009 opt1 0 6/1/2009 opt2 0 6/2/2009 opt1 0 6/2/2009 opt2 0 6/3/2009 opt1 0 6/3/2009 opt2 1
我很难弄清楚如何遍历日期范围。我确信这是可以为此创建的一些简单游标,但是我很茫然。最好在PL / SQL中
更新:
我最终在这里使用示例来完成我想做的事情。这将创建一个生成日期表的函数。
您将需要某种日历来遍历日期范围。我已经使用“按级别连接”技巧构建了一个。然后,您可以将日历与您的数据结合起来(交叉结合,因为即使在当天没有选择的情况下,您也希望连续一行):
SQL> WITH calendar AS ( 2 SELECT to_date(:begin_date, 'mm/dd/yyyy') + ROWNUM - 1 c_date 3 FROM dual 4 CONNECT BY LEVEL <= to_date(:end_date, 'mm/dd/yyyy') - to_date(:begin_date, 'mm/dd/yyyy') + 1 5 ) 6 SELECT c_date "date", d_option "option", COUNT(one_day) 7 FROM (SELECT c.c_date, d.d_option, 8 CASE 9 WHEN c.c_date BETWEEN d.start_date AND d.end_date THEN 10 1 11 END one_day 12 FROM DATA d, calendar c) 13 GROUP BY c_date, d_option 14 ORDER BY 1,2; date option COUNT(ONE_DAY) ----------- ------ -------------- 01/06/2009 opt1 0 01/06/2009 opt2 0 02/06/2009 opt1 0 02/06/2009 opt2 0 03/06/2009 opt1 1 03/06/2009 opt2 0 04/06/2009 opt1 1 04/06/2009 opt2 0 05/06/2009 opt1 1 05/06/2009 opt2 1 06/06/2009 opt1 1 06/06/2009 opt2 1 12 rows selected