ITPub博客

首页 > 数据库 > MySQL > 不使用分析函数的累计统计查询

不使用分析函数的累计统计查询

原创 MySQL 作者:呆呆笨笨的鱼 时间:2015-09-21 15:44:05 0 删除 编辑
案例:以日期金额统计为例
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博客 ” ,链接:https://blog.itpub.net/28929558/viewspace-1805281/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-04-17

  • 博文量
    62
  • 访问量
    939480