按月統計訂單數量報表SQL語句(CASE 和DECODE的使用)


本文主要是使用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的用法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM