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) 编辑 收藏 引用