随笔-64  评论-13  文章-2  trackbacks-0
oracle 行转列一例

在统计报表中经常需要进行行列信息的转换,如:
 对三张表:t0(dw),t1(dw,jb,v),t2(dw,jb,v)【t0,t1,t2可以是中间查询表】
   t0为所有要统计的单位的表格;
   t1为所有要统计的某个口径统计结果;
   t2为所有要统计的另一个口径统计结果;
   t1,t2中的dw相同时,其jb值有不同的值;v为需要统计的数字字段。
 最终要得到一张统计表
  (dw, t1jb1,t1jb2,...,t2jb1,t2jb2);

  这里提醒注意的是:
   1 应该首先对结果表的行记录给出一个明确的定义,即明确需求;
   2 按行定义确定结果表中行的KEY值,应根据结果集的内容,增加KEY字段;
   3 生成结果的语句可以参考以下例子。
   这里重新定义行的KEY为(dw+yjjb),所以最终的关联条件为
 where trim(allswjg.zrswjg_dm)=trim(t1.zrswjg_dm(+))
      and trim(allswjg.zrswjg_dm)=trim(t2.zrswjg_dm(+))
      and trim(allswjg.yjjb)=trim(t1.yjjb(+))
      and trim(allswjg.yjjb)=trim(t2.yjjb(+))
 即由
allswjg的zrswjg_dm和yjjb字段作为连接的初始条件,进行向右连接

-----------------------------例子-------------------------------
 select zrswjg_dm,
      sum(t1_cnt_jb1) as t1_cnt_jb1
     ,sum(t1_cnt_jb2) as t1_cnt_jb2
     ,sum(t1_cnt_jb3) as t1_cnt_jb3
     ,sum(t2_cnt_jb1) as t2_cnt_jb1
     ,sum(t2_cnt_jb2) as t2_cnt_jb2
     ,sum(t2_cnt_jb3) as t2_cnt_jb3 
----原来的结果表字段
    from (
    select substr(allswjg.zrswjg_dm,1,ljc) zrswjg_dm,
           case when (t1.yjjb=1) then t1.cnt else 0  end  as t1_cnt_jb1,
           case when (t1.yjjb=2) then t1.cnt else 0  end  as t1_cnt_jb2,
           case when (t1.yjjb=3) then t1.cnt else 0  end  as t1_cnt_jb3,
           case when (t2.yjjb=1) then t2.cnt else 0  end  as t2_cnt_jb1,
           case when (t2.yjjb=2) then t2.cnt else 0  end  as t2_cnt_jb2,
           case when (t2.yjjb=3) then t2.cnt else 0  end  as t2_cnt_jb3
----中间的结果表字段,这里加入了yjjb作为key的一部分,并通过case语句将t0,t1,t2三表按t0的key定义实现了行转列查询
    from
    (select distinct substr(swjg_dm,1,ljc) zrswjg_dm
               ,jc.yjjb from dm_swjg@glcx,t_jc_dm_yjjc jc---机构代码          
                where decode(ljc,9,'J',trim(swjg_bz))='J' --trim(swjg_bz)='J'
                      and swjg_dm like dw2 ||'%'
                      and substr(swjg_dm,1,ljc)!=dw2||'00' --排除本级数据
    )allswjg,           
    (
      select substr(zrswjg_dm,1,ljc) zrswjg_dm,yjjb,count(*) cnt from t_jc_sjdj dj
      where YJSJXWFSSJ>=sj1 and YJSJXWFSSJ<=sj2 and zrswjg_dm like dw2 ||'%'
            and dj.isstart='Y'
            and dj.isstop='Y'
      group by substr(zrswjg_dm,1,ljc),yjjb
    ) t1, --已解除的预警,           
    (
      select substr(zrswjg_dm,1,ljc) zrswjg_dm,yjjb,count(*) cnt from t_jc_sjdj dj
      where YJSJXWFSSJ>=sj1 and YJSJXWFSSJ<=sj2 and zrswjg_dm like dw2 ||'%'
            and dj.isstart='Y'
            and dj.isstop='Y'
            and dj.SJJCFS_DM=1 --人工解除
      group by substr(zrswjg_dm,1,ljc),yjjb
    ) t2 --已人工解除的预警
    where trim(allswjg.zrswjg_dm)=trim(t1.zrswjg_dm(+))
      and trim(allswjg.zrswjg_dm)=trim(t2.zrswjg_dm(+))
      and trim(allswjg.yjjb)=trim(t1.yjjb(+))
      and trim(allswjg.yjjb)=trim(t2.yjjb(+))
   )
   group by zrswjg_dm

  




 



posted on 2009-11-12 15:34 桂湖山 阅读(448) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。