2013-06-01 49 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,之前,之後,當前行的某種組合來獲得我想要的位置。但沒有運氣。 –