2014-03-07 51 views
0

我想創建一個附加列,該列計算來自count列的行與來自sum列的前一行的值。以下是查詢。我嘗試使用ROLLUP,但它不起作用。如何從另一列的計數中計算前一行的值

select to_char(register_date,'YYYY-MM') as "registered_in_month" 
     ,count(*) as Total_count 
from CMSS.USERS_PROFILE a 
where a.pcms_db != '*' 
group by (to_char(register_date,'YYYY-MM')) 
order by to_char(register_date,'YYYY-MM') 

這就是我得到

registered_in_month TOTAL_COUNT 
------------------------------------- 
2005-01    1 
2005-02    3 
2005-04    8 
2005-06    4 

但我想顯示爲以下,其中包括具有算作0

registered_in_month TOTAL_COUNT SUM 
------------------------------------------ 
2005-01    1   1 
2005-02    3   4 
2005-03    0   4 
2005-04    8   12 
2005-05    0   12 
2005-06    4   16 
+0

有兩個部分,以本 - 1)按月彙總,以及包括失蹤個月(日曆表將幫助您極大)2)運行總和(其中應該有多個在這個網站上的例子)。 –

+0

同意。但問題是我不知道如何總結它與count(*)的結果得到的行。如果有人能證明這一點會很棒 – user3361530

+0

我發佈的問題與你提到的重複完全不同。任何人都可以請儘快幫忙。 我還沒有太多的關於sql的知識,所以我會很感激,如果你考慮,而在回答 – user3361530

回答

2

月將失蹤月在結果,首先你需要有完整的月份列表。要做到這一點,你應該找到最早和最新的月份,然後使用heirarchial 查詢來生成完整列表。

SQL Fiddle

with x(min_date, max_date) as (
    select min(trunc(register_date,'month')), 
     max(trunc(register_date,'month')) 
    from users_profile 
) 
select add_months(min_date,level-1) 
from x 
connect by add_months(min_date,level-1) <= max_date; 

一旦你把所有的幾個月裏,你能外其加入到你的表。要獲得累計和,只需使用SUM作爲分析函數將計數相加即可。

with x(min_date, max_date) as (
    select min(trunc(register_date,'month')), 
     max(trunc(register_date,'month')) 
    from users_profile 
), 
y(all_months) as (
    select add_months(min_date,level-1) 
    from x 
    connect by add_months(min_date,level-1) <= max_date 
) 
select to_char(a.all_months,'yyyy-mm') registered_in_month, 
     count(b.register_date) total_count, 
     sum(count(b.register_date)) over (order by a.all_months) "sum" 
from y a left outer join users_profile b 
     on a.all_months = trunc(b.register_date,'month') 
group by a.all_months 
order by a.all_months; 

輸出:

| REGISTERED_IN_MONTH | TOTAL_COUNT | SUM | 
|---------------------|-------------|-----| 
|    2005-01 |   1 | 1 | 
|    2005-02 |   3 | 4 | 
|    2005-03 |   0 | 4 | 
|    2005-04 |   8 | 12 | 
|    2005-05 |   0 | 12 | 
|    2005-06 |   4 | 16 | 
+0

+1 - 對於Oracle,調用'TRUNC(...) '作爲連接的一部分使指數的使用無效?如果是這樣,你可能想修改連接到'ON b.register_date> = a.all_months AND b.register_date

相關問題