Oracle按日期分組統計資料
阿新 • • 發佈:2019-02-18
昨天專案突然改了個需求,要求折線圖的資料顯示,必須按照月三天,季度九天來分組統計資料,網上搜索了一堆,差點沒找著相關的!還好找到了類似的,現整理下提供給有需要的大家參考參考!
(本人是在Oracle資料庫的環境下)
1. 首先,我們先來建立個測試表test_table:
表中的date_欄位為日期,num_欄位為日期相對的資料:
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_
結束!
如有錯誤或不足之處,請大家多多指出,謝謝!