本文主要是使用CASE 和DECODE實現按月統計訂單數量,通過此示例希望能幫助讀者理解CASE和DECODE在ORCALE中的使用。
1.使用CASE實現:
SELECT OPERATING_WAREHOUSE_CODE,SUM(M1) AS M1,SUM(M2) AS M2,SUM(M3) AS M3 FROM ( SELECT OPERATING_WAREHOUSE_CODE, CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '01' THEN '1' ELSE '0' END AS M1, CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '02' THEN '1' ELSE '0' END AS M2, CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '03' THEN '1' ELSE '0' END AS M3 FROM OMS_ORDER_HEAD M WHERE M.ORDER_CREATION_DTE > TO_DATE('2012-1-1','YYYY-MM-DD') AND M.ORDER_CREATION_DTE < TO_DATE('2012-4-1','YYYY-MM-DD') ) GROUP BY OPERATING_WAREHOUSE_CODE ORDER BY OPERATING_WAREHOUSE_CODE
這是一條按月統計每個OPERATING_WAREHOUSE_CODE訂單數量的SQL語句,統計2012年一到三月份每個OPERATING_WAREHOUSE_CODE的訂單數量。
本文主要介紹下CASE WHEN THEN ELSE END AS的使用。
文中:
CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '01' THEN '1' ELSE '0' END AS M1
這段SQL主要是把表OMS_ORDER_HEAD中訂單創建時間為一月份的標記為”1”,並且這段代碼增加了一列M1,同樣M2和M3分別對應二月份和三月份,根據訂單創建的時間其對應的月份M1,M2,M3列的值會被標記為1。
SELECT OPERATING_WAREHOUSE_CODE, CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '01' THEN '1' ELSE '0' END AS M1, CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '02' THEN '1' ELSE '0' END AS M2, CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '03' THEN '1' ELSE '0' END AS M3 FROM OMS_ORDER_HEAD M WHERE M.ORDER_CREATION_DTE > TO_DATE('2012-1-1','YYYY-MM-DD') AND M.ORDER_CREATION_DTE < TO_DATE('2012-4-1','YYYY-MM-DD')
其中這段SQL執行的結果如圖:
然后在此基礎上再對M1(一月),M2(二月),M3(三月)對應的訂單數量用SUM進行統計。
整條SQL語句的執行結果入下圖:
整條SQL語句用CASE WHEN THEN ELSE END AS結合SUM很好的統計出2012年前三個月每個OPERATING_WAREHOUSE_CODE的訂單數量。
2.使用DECODE實現
當然我們同樣可以通過使用ORACLE中的DECODE來實現同樣的功能,DECODE的實現代碼:
select OPERATING_WAREHOUSE_CODE,SUM(DECODE(TO_CHAR(OH.Order_Creation_Dte,'mm'),01,1,0)) as M1, SUM(DECODE(TO_CHAR(OH.ORDER_CREATION_DTE,'mm'),02,1,0)) AS M2, SUM(DECODE(TO_CHAR(OH.ORDER_CREATION_DTE,'mm'),03,1,0)) AS M3 from OMS_ORDER_HEAD OH WHERE OH.ORDER_CREATION_DTE>TO_DATE('2012-1-1','YYYY-MM-DD') AND OH.ORDER_CREATION_DTE < TO_DATE('2012-4-1','YYYY-MM-DD') GROUP BY OPERATING_WAREHOUSE_CODE ORDER BY OPERATING_WAREHOUSE_CODE
以上SQL可以達到上述CASE同樣的效果。
在邏輯編程中,經常用到If – Then –Else 進行邏輯判斷。在DECODE的語法中,實際上就是這樣的邏輯處理過程。它的語法如下:
DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
不管是用CASE還是DECODE都可以達到同樣的效果,在理解的基礎上我們可以靈活使用DECODE和CASE的用法。