2013-06-01 46 views
2

我想创建一个视图,返回雨水总计的月份。视图返回的每一行代表给定年份的一个月份。动态运行总计

在这个观点中,我想列出一年中累计降雨量的一列,例如1月份的一排会有1月份的降雨总量。 2月份的排的总数为Jan+Feb,Mar的排的总数为Jan+Feb+Mar,等等,直到12月份为止。

困难的是我希望能够查询特定日期的视图 前。 “select * from vw_rain_stats where rain_date >= to_date('2010-MAR-01')”,累计总额列应从where子句(3月)中指定的月份开始累计,而不是1月。

我不希望2010年3月 - 01月之前的任何月雨量都包含在视图返回的数据中。

我可以开发一个视图,累积整个年份的债券,但我无法弄清楚如何开发视图,以便它可以开始累计一月以外的债券。

由于2012年1月至2013年2月的数据存在于基础表格中,并且该时间段内每个月都有一些降雨(无零月降雨)。

create table rain_stats (rain_date date, amt number); 

insert into rain_stats values ('2012-JAN-01', 50); 
insert into rain_stats values ('2012-FEB-01', 10); 
insert into rain_stats values ('2012-MAR-01', 20); 
insert into rain_stats values ('2012-APR-01', 40); 
insert into rain_stats values ('2012-MAY-01', 30); 
insert into rain_stats values ('2012-JUN-01', 10); 
insert into rain_stats values ('2012-JUL-01', 4); 
insert into rain_stats values ('2012-AUG-01', 100); 
insert into rain_stats values ('2012-SEP-01', 5); 
insert into rain_stats values ('2012-OCT-01', 100); 
insert into rain_stats values ('2012-NOV-01', 90); 
insert into rain_stats values ('2012-DEC-01', 80); 
insert into rain_stats values ('2013-JAN-01', 30); 
insert into rain_stats values ('2013-FEB-01', 7); 

用户执行该查询

select * from vw_rain_stats where rain_date >= '2012-MAY-01'

这是一种返回的结果;

 
|   RAIN_DATE | AMT | RUNNING_AMT | 
------------------------------------------ 
|  May, 01 2012 | 30 |   30 | 
|  Jun, 01 2012 | 10 |   40 | 
|  Jul, 01 2012 | 4 |   44 | 
|  Aug, 01 2012 | 100 |   144 | 
|  Sep, 01 2012 | 5 |   149 | 
|  Oct, 01 2012 | 100 |   249 | 
|  Nov, 01 2012 | 90 |   339 | 
|  Dec, 01 2011 | 80 |   419 | 
|  Jan, 01 2013 | 30 |   30 | 
|  Feb, 01 2013 | 70 |   100 | 
| .................. | ... | ........... | 

请注意,2012年1月至4月的雨量未包含在结果集或running_amt累积值中。这就是我想要发生的事情。

+0

您可以添加表格格式和所需输出的快速样本吗? –

回答

3

已更新您是否正在寻找?

CREATE VIEW vw_rain_stats 
AS 
    SELECT TRUNC(rain_date, 'MM') rain_date, 
     SUM(amt) amt 
    FROM rain_stats 
    GROUP BY TRUNC(rain_date, 'MM') 
; 

获取每月数额为2012年

SELECT rain_date, 
     amt, 
     SUM(amt) OVER (ORDER BY rain_date) running_amt 
    FROM vw_rain_stats 
WHERE rain_date BETWEEN '01-JAN-12' AND '01-DEC-12'; 

获取每月的数量开始2011年12月

SELECT rain_date, 
     amt, 
     SUM(amt) OVER (ORDER BY rain_date) running_amt 
    FROM vw_rain_stats 
WHERE rain_date >= '01-DEC-11'; 

输出示例:

|   RAIN_DATE | AMT | RUNNING_AMT | 
------------------------------------------ 
| December, 01 2011 | 80 |   80 | 
| January, 01 2012 | 30 |   110 | 
| February, 01 2012 | 70 |   180 | 
| March, 01 2012 | 110 |   290 | 
| .................. | ... | ........... | 

这里是SQLFiddle演示

+0

@DarcyDommer更新了答案和sqlfiddle。您可以自由选择使用此方法的任何时间间隔。 – peterm

+0

谢谢你看看这个。你有正确的想法,但我希望sum实现在视图定义中。我不希望用户需要知道该部分。视图查询应该像“select rain_date,amt,running_amt from vw_rain_stats where rain_date> = '01 -MAR-2012'' –

+0

因此,您可能需要一个存储过程,将日期变量传递给查询上方的查询风景。 –

0

我不确定我是否按照您的要求进行操作,但听起来像是您想要Window功能的情况。如果您添加到您的视图:

SUM(Rain_Amt) OVER (ORDER BY rain_date) AS cum_Rain 

你可以通过从每个后续日期减去开始日期的累计雨量获得的累计降雨量任何日起,这样的:

SELECT *, cum_Rain - (SELECT cum_Rain FROM vw_rain_stats WHERE rain_date = '20070405') 
FROM vw_rain_stats 
WHERE rain_date >= '20070405' 
+0

谢谢。你有正确的想法,但我想弄清楚如何把所有的求和实现放在视图定义中。我希望用户需要做的就是提供一个日期。鉴于该日期,该视图将返回按年份和月份排序的结果集。它应该从结果集的第一行(或月)开始累计雨量,并在第一个Dec行之后重置累计。然后开始再次累积每行直到下一个12月行。依此类推... –

0

让我假设你有一个潜在的表RainDays这是每天的雨量。

你会认为,你想要的是以下几种观点:

create view vw_RainMonths as 
    select yyyymm, RainMonth, 
      sum(RainMonth) over (order by yyyymm) as cum 
    from (select to_char(RainDate as 'YYYY-MM') as yyyymm, sum(Rain) as RainMonth 
      from RainDays 
      group by to_char(RainDate as 'YYYY-MM') 
     ) t 

然而,这是不行的,因为(你怀疑),从一开始的时候累计值。该条款适用于where条款。

Oracle不支持表值函数,参数化视图和流水线表函数 - 所有这些函数都可以用作视图并在参数中应用值。不幸的是,这些都不如单一视图那么干净。它们需要为返回值创建一个新的数据类型。

+0

是的。是否有一种方法可以在评估where子句之后获得分析总和? –

+0

@DarcyDommer。 。 。基本上,有办法,但它们不像添加视图那么简单。 –

+0

我以为我可以使用窗口和分区以及sum,lag,之前,之后,当前行的某种组合来获得我想要的位置。但没有运气。 –