在很多項目中都會有資料統計的功能,如按照年、月、周、日統計某個使用者提交的數量;或者直接統計指定年、月、周或者日新增的數量。最近我接觸的一個項目,客戶就要求根據月和周統計每個單位提價提交的數量。 按年統計
select o.id, o.name, to_char(a.create_date,'yyyy'), count(*)from news aleft join sys_user u on u.id = a.create_by left join sys_office o on o.id = u.office_idgroup by o.id,o.name,to_char(a.create_date,'yyyy')
這裡就是將建立時間格式化為年形式,按照單位id分組,查詢出提交的數量。
按月統計
這裡直接將上面的的日期格式改為yyyy-MM形式即可。
select o.id, o.name, to_char(a.create_date,'yyyy-MM'), count(*)from news aleft join sys_user u on u.id = a.create_by left join sys_office o on o.id = u.office_idgroup by o.id,o.name,to_char(a.create_date,'yyyy-MM')
按周統計
按周統計可以顯示兩種效果,一種是顯示出該日期的周一的日期,也就是自然周的日期,另外一種是按周自然周統計。 按自然周統計
select o.id, o.name, to_char(a.create_date,'ww'), count(*)from t_dzjg_news aleft join sys_user u on u.id = a.create_by left join sys_office o on o.id = u.office_idgroup by o.id,o.name,to_char(a.create_date,'ww')
這裡的ww是擷取該日期的在年中的第幾周。
按自然周的日期統計
這裡處理起來可以會比較繁瑣,首先要擷取日期的所在周的周一的日期,然後根據周一日期分組查詢:
---擷取指定日期的周一的日期select trunc(sysdate,'ww') from dual;select to_char(trunc(sysdate,'ww'),'yyyy-MM-dd') from dual;---將建立時間格式為周一的形式,再去尋找select o.id, to_char(trunc(a.create_date,'ww'),'yyyy-MM-dd') AS 周一, count(*)from t_dzjg_news aleft join sys_user u on u.id = a.create_by left join sys_office o on o.id = u.office_idgroup by o.id,to_char(trunc(a.create_date,'ww'),'yyyy-MM-dd')
這裡使用到一個函數trunc():該函數類似截取函數,按指定的格式截取輸入的資料。這裡將時間截取為顯示周的形式。 按季度統計
在oracle中q為時間的季度如:
select to_char(sysdate,'q') from dual;--取得目前時間的季度
所以上面的sql可以改為:
select o.id, to_char(a.create_date,'q') AS 季度, count(*)from t_dzjg_news aleft join sys_user u on u.id = a.create_by left join sys_office o on o.id = u.office_idgroup by o.id, to_char(a.create_date,'q')
按天統計
這個就幾乎沒啥好說的了:
select o.id, to_char(a.create_date,'yyyy-MM-dd') AS 日期, count(*)from t_dzjg_news aleft join sys_user u on u.id = a.create_by left join sys_office o on o.id = u.office_idgroup by o.id, to_char(a.create_date,'yyyy-MM-dd')
總結
對於資料庫資料的統計,這些還只是很簡單基礎。這幾天通過寫那些統計功能,雖然寫的頭大,但是對資料庫知識越來越深。對於寫複雜的sql語句,要細分問題,一步步的查詢,最後將一步步分析的簡單的查詢組合成想要的複雜查詢,可以說是從小到大,切忌從大到小。 最後
關於Oracle資料庫中對時間常用的操作可以查看我之前的一篇部落格:
Oeacle常見的日期處理