不使用分析函式的累計統計查詢

呆呆笨笨的魚發表於2015-09-21
案例:以日期金額統計為例
SQL> select * from day_sales;
 
SALE_DATE   DAY_AMOUNT
----------- ----------
2015/1/1           300
2015/1/3           300
2015/1/4           400
2015/1/5          1000


首先分析函式很容易就能得到結果,所以先看一下分析函式的統計結果:
SQL> select
  2  t.sale_date
  3  ,t.day_amount
  4  ,sum(t.day_amount) over (order by  t.sale_date rows between unbounded preceding and current row) as sum_res
  5  from day_sales t
  6  ;
 
SALE_DATE   DAY_AMOUNT    SUM_RES
----------- ---------- ----------
2015/1/1           300        300
2015/1/3           300        600
2015/1/4           400       1000
2015/1/5          1000       2000


然後,不用分析函式實現:
SQL> select
  2   t.sale_date
  3  ,t.day_amount
  4  ,(select sum(day_amount) from day_sales t1 where t1.sale_date <= t.sale_date) as sum_res
  5  from day_sales t
  6  ;
 
SALE_DATE   DAY_AMOUNT    SUM_RES
----------- ---------- ----------
2015/1/1           300        300
2015/1/3           300        600
2015/1/4           400       1000
2015/1/5          1000       2000


=============================切割線=========================================
變一下這個例子:

SALE_DATE                                    USERID                                 ITEM_ID       AMOUNT
----------- --------------------------------------- --------------------------------------- ------------
2015/1/1                                       1001                                     101       100.00
2015/1/1                                       1002                                     121       200.00
2015/1/3                                       1001                                     101       300.00
2015/1/4                                       1003                                     103       400.00
2015/1/5                                       1004                                     101       500.00
2015/1/5                                       1004                                     105       500.00

用分析函式 和 不用分析函式 分別求 按日期升序的累計 (結果跟上面的例子是一樣的)

思路其實就是將子集先整理好,然後再生成最終結果集!

先用分析函式:
SQL> select
  2  t.sale_date
  3  ,t.day_amount
  4  ,sum(t.day_amount) over (order by  t.sale_date rows between unbounded preceding and current row) as sum_res
  5  from
  6  (
  7  select
  8   sale_date
  9  ,sum(amount) as day_amount
 10  from tb_sales
 11  group by sale_date
 12  order by sale_date
 13  ) t
 14  ;
 
SALE_DATE   DAY_AMOUNT    SUM_RES
----------- ---------- ----------
2015/1/1           300        300
2015/1/3           300        600
2015/1/4           400       1000
2015/1/5          1000       2000



不使用分析函式,按照切割線前面的例子做一個體會其實就很快得到結果了:

SQL> select
  2  t.sale_date
  3  ,t.day_amount
  4  ,(select sum(t1.amount) from  tb_sales t1 where t1.sale_date <= t.sale_date) as sum_res
  5  from
  6  (
  7  select
  8   sale_date
  9  ,sum(amount) as day_amount
 10  from tb_sales
 11  group by sale_date
 12  order by sale_date
 13  ) t
 14  ;
 
SALE_DATE   DAY_AMOUNT    SUM_RES
----------- ---------- ----------
2015/1/1           300        300
2015/1/3           300        600
2015/1/4           400       1000
2015/1/5          1000       2000







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1805281/,如需轉載,請註明出處,否則將追究法律責任。

相關文章