oracle 列转行list,oracle 行转列的通用过程

原文传送门:http://topic.csdn.net/u/20091019/11/67cd55a3-3f42-4db7-a3f8-91dd52a913cd.html?24122

经常遇到发帖求行列转换的代码,用max(decode(..))回复后,十有八九会再问一句:如果列名不固定,或者列数不固定怎么办。就要用存储过程来写,这些存储过程的代码都大同小异,我就想能不能写个通用点的过程

试了一下,把结果发出来

SQL code

create or replace procedure proc(tabname in varchar2,

col1 in varchar2,

col2 in varchar2,

col3 in varchar2,

viewname in varchar2 default 'v_tmp')

as

sqlstr varchar2(2000):='create or replace view '||viewname||' as select '||col1||' ';

c1 sys_refcursor;

v1 varchar2(100);

begin

open c1 for 'select distinct to_char('||col2||') from '||tabname;

loop

fetch c1 into v1;

exit when c1%notfound;

sqlstr:=sqlstr||'

,max(decode('||col2||','''||v1||''','||col3||'))"'||v1||'"';

end loop;

close c1;

sqlstr:=sqlstr||' from '||tabname||' group by '||col1;

execute immediate sqlstr;

end proc;

这里的几个参数,tabname指的是需要进行行列转换的表名,col1是这个表中行列转换以后要根据哪一列进行分组,那一列的列名。col2传入的是要将行转成列的那一列的列名,col3表示需要进行统计的数据列的列名

viewname传入希望建立的视图的名称,可以不填,默认为v_tmp

这么说很难让人明白..举个例子,引用一个帖子的数据

create table tab (

counter varchar(20),        -- 参加考试人数

subject varchar(20),        -- 科目

class varchar(20)          -- 班级

)

表数据:

counter  subject  class

36        英语      一班

44        英语      二班

44        数学      二班

33        语文      一班

39        语文      三班

转换后:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值