1. 程式人生 > >Oracle按日期分組統計資料

Oracle按日期分組統計資料

昨天專案突然改了個需求,要求折線圖的資料顯示,必須按照月三天,季度九天來分組統計資料,網上搜索了一堆,差點沒找著相關的!還好找到了類似的,現整理下提供給有需要的大家參考參考!
(本人是在Oracle資料庫的環境下)

1. 首先,我們先來建立個測試表test_table:

  • 表中的date_欄位為日期,num_欄位為日期相對的資料:

    test_table

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是什麼意思,其實就是要顯示的條數罷了,如果運用到專案上的話,我個人認為應該儘量把它的值設大寫,起碼要大於或等於我們要統計的所有日期吧!

    間隔三天的日期表

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語句查詢的結果:當然,不用懷疑,我是根據三天中的第一天來顯示的.

    每三天分組的結果

    當然,如果你想顯示三天中的最後一天,你可以這樣子:

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_ 

結束!
如有錯誤或不足之處,請大家多多指出,謝謝!