Oracle按日期分组统计数据


昨天项目突然改了个需求,要求折线图的数据显示,必须按照月三天,季度九天来分组统计数据,网上搜索了一堆,差点没找着相关的!还好找到了类似的,现整理下提供给有需要的大家参考参考!
(本人是在Oracle数据库的环境下)

1. 首先,我们先来创建个测试表test_table:

  • 表中的date_字段为日期,num_字段为日期相对的数据:

    Oracle按日期分组统计数据_第1张图片

2. 现在我先来通过Oracle特有的虚表dual来显示间隔每三天的日期:

SELECT TO_DATE('2016-12-20', 'yyyy-MM-dd hh24:mi:ss') + (LEVEL-1) * 1 dt_
FROM dual CONNECT BY LEVEL <= 20
  • 当然,有人可能会问LEVEL <= 20是什么意思,其实就是要显示的条数罢了,如果运用到项目上的话,我个人认为应该尽量把它的值设大写,起码要大于或等于我们要统计的所有日期吧!

    Oracle按日期分组统计数据_第2张图片

3.接着,我们就来根据这个进行每三天分组统计数据吧:

SELECT b.dt_,"SUM"(a.num) num FROM test_table a ,(SELECT TO_DATE('2016-12-20', 'yyyy-MM-dd hh24:mi:ss') + (LEVEL-1) * 3 dt_
FROM dual CONNECT BY LEVEL <=20) b WHERE a.date_ >= b.dt_ AND a.date_ < b.dt_ + 3 GROUP BY b.dt_ ORDER BY b.dt_
  • 以下就是上面sql语句查询的结果:当然,不用怀疑,我是根据三天中的第一天来显示的.

    Oracle按日期分组统计数据_第3张图片

    当然,如果你想显示三天中的最后一天,你可以这样子:

SELECT b.dt_,"SUM"(a.num) num FROM test_table a ,(SELECT TO_DATE('2016-12-20', 'yyyy-MM-dd hh24:mi:ss') + (LEVEL-1) * 3 dt_
FROM dual CONNECT BY LEVEL <=20) b WHERE a.date_ < b.dt_ AND a.date_ >= b.dt_ - 3 GROUP BY b.dt_ ORDER BY b.dt_

4. 综上所述,如果想要根据每九天分组来统计数据:

  • 直接将上面的3改成9即可:
SELECT b.dt_,"SUM"(a.num) num FROM test_table a ,(SELECT TO_DATE('2016-12-20', 'yyyy-MM-dd hh24:mi:ss') + (LEVEL-1) * 9 dt_
FROM dual CONNECT BY LEVEL <=20) b WHERE a.date_ >= b.dt_ AND a.date_ < b.dt_ + 9 GROUP BY b.dt_ ORDER BY b.dt_ 

结束!
如有错误或不足之处,请大家多多指出,谢谢!


你可能感兴趣的:(数据库)