问题说明:需要配置一个报表,现有一张表xmb,表结构为:x_xmmc(班级名称)、x_xmbm(班级编码,唯一)、x_bdsj(报到时间)、x_lxsj(离校时间)、x_pxrs(培训人数),现要查询出当前年份每个月的的培训人数,即分别列出一月份,二月份,三月份.....十二月份的培训人数,除了select yf, rs  from (select '一月' yf, sum(x_pxrs) rs from xmb where x_bdsj<='2010-01-31' and x_lxsj>='2010-01-01')union (select '二月' yf, sum(x_pxrs)rs from xmb where x_bdsj<='2010-02-28' and x_lxsj>='2010-02-01') 然后union三月,四月....求这种方式来查询以外的高效、简便的查询方法,而且其中的时间是当前年份的各个月份,是动态的,比如2010年查看的时候就是2010年每个月的人数,到2011年查看的时候就是2011年各个月份的,望高手指点。

解决方案 »

  1.   

    你decode 行列转换
    google下 有好多例子的
    --paddy的博客
    http://blog.csdn.net/gelyon/archive/2010/09/20/5897608.aspx
      

  2.   


    --先生成一张你当前年份的每个月的开始日期和结束日期的临时表,如:
    SELECT To_Char(Add_Months(Trunc(SYSDATE,'yyyy'),LEVEL-1),'yyyy-mm-dd') starttime,
    To_Char(Last_Day(Add_Months(Trunc(SYSDATE,'yyyy'),LEVEL-1)),'yyyy-mm-dd') endtime 
    FROM dual
    CONNECT BY LEVEL<=12;--然后用这个临时表跟你原表进行外连接,依据月份进行分组,再用decode转换一下,转换12次而已,因为有12个月。
    --只是简单的行列转化而已