Oracle 按年或月进行统计

csdn上看到的问题,想想写了一个。不对的地方请指正。

 

画面机能要求对一张表的数据进行统计
表定义(略去用不到的字段)
LB01_PURRECEIVEBOOK

PURRECEIVEDATE    DATE,        --format: 2009/11/01
RECEIVEAMT        NUMBER

① 按年统计时,如果出现空年,则做成该年度金额为0
例:
2009/09/01    1,000
2009/11/01    3,000
2007/12/01    2,000
抽出:
2009    4,000
2008    0
2007    2,000
②按月统计时,出现空月,则做成该月份金额为0
2009/09/01    1,000
2009/11/01    3,000
2009/12/01    2,000
抽出:
2009/09    1,000
2009/10    0
2009/11    3,000
2009/12    2,000


这个可以比较简单的作出来吗?
 
按照年统计
  1. WITH tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) -     
  2.        MIN(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) AS NUM,     
  3.        MIN(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) AS MINYEAR     
  4.   FROM LB01_PURRECEIVEBOOK T     
  5. ),     
  6. select_table AS (     
  7. SELECT SUM(T.RECEIVEAMT) AS YEARSUM,  
  8.        TO_CHAR(T.PURRECEIVEDATE, 'YYYY') AS YEAR  
  9.   FROM LB01_PURRECEIVEBOOK T  
  10.  GROUP BY TO_CHAR(T.PURRECEIVEDATE, 'YYYY')  
  11. ),     
  12. creatyear_table AS (     
  13. SELECT tmp_table.MINYEAR + LEVEL - 1 AS tmp_year FROM DUAL, tmp_table     
  14. CONNECT BY LEVEL <= tmp_table.NUM + 1    
  15. )     
  16.     
  17. SELECT      
  18. ct.tmp_year,     
  19. NVL(st.YEARSUM, 0) AS YEARSUM     
  20. FROM     
  21. creatyear_table ct,     
  22. select_table st     
  23. WHERE     
  24. ct.tmp_year = st.year(+)    
  25. ORDER BY ct.tmp_year DESC  

按照月进行统计
  1. WITH tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'mm')) -     
  2.        MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) AS NUM,     
  3.        MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) AS MINMM,     
  4.        MIN(TO_CHAR(T.PURRECEIVEDATE, 'YYYY')) AS MINY     
  5.   FROM LB01_PURRECEIVEBOOK T     
  6. ),     
  7. select_table AS (     
  8. SELECT SUM(T.RECEIVEAMT) AS MMSUM,  
  9.        TO_CHAR(T.PURRECEIVEDATE, 'MM') AS MM  
  10.   FROM LB01_PURRECEIVEBOOK T  
  11.  GROUP BY TO_CHAR(T.PURRECEIVEDATE, 'MM')  
  12. ),     
  13. creatyear_table AS (     
  14. SELECT tmp_table.MINMM + LEVEL - 1 AS TMP_MM,     
  15.        TO_CHAR(TO_DATE(MINY || tmp_table.MINMM + LEVEL - 1'YYYY-MM'), 'YYYY-MM') AS TMP_YM     
  16. FROM DUAL, tmp_table     
  17. CONNECT BY LEVEL <= tmp_table.NUM + 1    
  18. )     
  19. SELECT      
  20. ct.TMP_YM,     
  21. TO_CHAR(NVL(ST.MMSUM, 0), '9,999') AS MMSUM     
  22. FROM     
  23. creatyear_table CT,     
  24. select_table ST     
  25. WHERE     
  26. CT.TMP_MM = ST.MM(+)     
  27. ORDER BY      
  28. ct.TMP_YM   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值