基於oracle的統計分析-------上週、上月、本年

一、上個月的每一天

SELECT
	LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)) - (ROWNUM - 1) s_date
FROM
	dual CONNECT BY ROWNUM <= (
			TO_CHAR (
				LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)),'dd'
			) 
	)

查出的結果如下圖所示,下圖只展示了部分日期。如需查找上兩個月,只需將ADD_MONTHS中的-1改成-2即可,依次類推。
在這裏插入圖片描述
注:

本月最後一天:

SELECT LAST_DAY (SYSDATE ) FROM dual

上月最後一天

SELECT LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)) FROM dual

本月總天數

select TO_CHAR (LAST_DAY (SYSDATE ),'dd' )  from dual

上月的總天數

select TO_CHAR (LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)),'dd' )  from dual

二、上週每一天

SELECT
	trunc(sysdate,'iw') -1 - (ROWNUM - 1) s_date
FROM
	dual CONNECT BY ROWNUM <= 7

查出的結果如下圖所示。如需查找上上週,只需將trunc後面的-1改成-2即可,依次類推。
在這裏插入圖片描述
注:

每週的星期一:

select trunc(sysdate,'iw') from dual;

三、本年每個月

select add_months(trunc(sysdate,'yyyy'), (rownum - 1)) AS RQ from dual CONNECT BY rownum <= 12

在這裏插入圖片描述

四、統計本年每個月提交的訂單數量

例如,有一張表,叫TB_ORDER,裏面有個創建時間字段CREATE_TIME。
1、現在需要統計本年每個月提交的訂單數量,則SQL如下:

SELECT TO_CHAR (RQ, 'YYYY/MM') AS RQ, NVL(value, 0)
FROM
	(
		(
			select add_months(trunc(sysdate,'yyyy'), (rownum - 1)) AS RQ from dual CONNECT BY rownum <= 12
		) t1
		LEFT JOIN (
			SELECT COUNT (*) AS VALUE, TRUNC (CREATE_TIME, 'mm') AS TJSJ
			FROM
			TB_ORDER
			GROUP BY TRUNC (TJSJ, 'mm')
		) t2 ON TO_CHAR (t1.RQ, 'YYYYMM') = TO_CHAR (t2.TJSJ, 'YYYYMM')
	)
ORDER BY RQ

2、統計上週每天提交的訂單數量,則SQL如下:

SELECT TO_CHAR (RQ, 'MM/DD') AS RQ, NVL (VALUE, 0) 
FROM
	(
		(
			SELECT TRUNC (SYSDATE, 'iw') - 1 - (ROWNUM - 1) RQ
			FROM dual CONNECT BY ROWNUM <= 7
		) t1
		LEFT JOIN (
			SELECT COUNT (*) AS VALUE, TRUNC (CREATE_TIME, 'dd') AS TJSJ
			FROM TB_ORDER
			GROUP BY TRUNC (TJSJ, 'dd')
		) t2 ON TO_CHAR (t1.RQ, 'YYYYMMDD') = TO_CHAR (t2.tjsj, 'YYYYMMDD')
	)

3、統計上月每天提交的訂單數量,則SQL如下:

SELECT TO_CHAR (RQ, 'MM/DD') AS RQ, NVL (VALUE, 0) 
FROM
	(
		(
			SELECT TRUNC (SYSDATE, 'iw') - 1 - (ROWNUM - 1) RQ
			FROM dual CONNECT BY ROWNUM <= 7
		) t1
		LEFT JOIN (
			SELECT COUNT (*) AS VALUE, TRUNC (CREATE_TIME, 'dd') AS TJSJ
			FROM TB_ORDER
			GROUP BY TRUNC (TJSJ, 'dd')
		) t2 ON TO_CHAR (t1.RQ, 'YYYYMMDD') = TO_CHAR (t2.tjsj, 'YYYYMMDD')
	)

五、函數解釋

1、NVL (VALUE, 0):即nvl(a, b)函數,a可以是一個值或者一個表達式,當a的值爲假時,則以b的值代替此值,類似java的三目運算符。在上述SQL中起到的作用是,當VALUE的值爲null時,則以0代替。
2、TO_CHAR (RQ, ‘MM/DD’):即to_char(a, b),將逗號左邊的數據以逗號右邊的形式格式化爲字符串。
3、TRUNC():截取日期或數字,返回指定的值。
4、add_months(a, b):在a的基礎上進行加月數、減月數的操作,Y的值爲負數則是減,如a中的月份是7月,b的值爲1,則是8月,b的值爲-1,則是6月。
5、SYSDATE:系統當前時間。
6、DUAL:oracle的虛擬表,主要用來選擇系統變量或求一個表達式的值,用來構成select的語法規則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章