oracle列转行
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle列转行
1------------------------
表结构:
1A
1B
1C
2A
2B
3C
3F
4D
转换后变成:
1A,B,C
2A,B
3C,F
4D
假设你的表结构是tb_name(id,remark),则语句如下:
SELECT
a.id,
wm_concat(a.remark)new_result
FROM
tb_name a
group by
a.id
2----------------------------------
产品名称销售额季度
奶酪50第一季度
奶酪60第二季度
啤酒50第二季度
啤酒80第四季度
。。。
。。。
想转换成如下格式
产品名称第一季度销售额第二季度销售额第三季度销售额第四季度销售额
奶酪50600 0
啤酒0500
80
oracle下可以用函数decode处理:
select产品名称,
sum(decode(季度,'第一季度',销售额,0))第一季度销售额,
sum(decode(季度,'第二季度',销售额,0))第二季度销售额,
sum(decode(季度,'第三季度',销售额,0))第三季度销售额,
sum(decode(季度,'第四季度',销售额,0))第四季度销售额,
from表名
group by产品名称;
3-------------------------------------------
oracle行转列的通用过程2010-04-0923:28经常遇到发帖求行列转换的代码,用max(decode(..))回复后,十有八九会再问一句:如果列名不固定,或者列数不固定怎么办。就要用存储过程来写,这些存储过程的代码都大同小异,我就想能不能写个通用点的过程
试了一下,把结果发出来
SQL code
create or replace procedure proc(tabname in varchar2,
col1in varchar2,
col2in varchar2,
col3in varchar2,
viewname in varchar2default'v_tmp')
as
sqlstr varchar2(2000):='create or replace view '||viewname||'as select'||col1||''; c1sys_refcursor;
v1varchar2(100);
begin
open c1for'select distinct to_char('||col2||') from'||tabname;
loop
fetch c1into v1;
exit when c1%notfound;
sqlstr:=sqlstr||'
,max(decode('||col2||','''||v1||' '','||col3||'))"'||v1||'&quo
t;';
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语文三班
转换后:
一班二班三班
英语36440
数学0440
语文33039
编译好过程后,执行
SQL code
begin
proc('tab','subject','class',& #39;counter');
end;
--结果
select*from v_tmp;
SUBJECT一班三班二班
数学44
英语3644
语文3339
如果对这个结果不是很满意,需要自己进行一些修改,比如空值的地方用0代替,或者需要用别的函数聚合而不是max。可以将过程中的execute immediate那句改成
dbms_output.put_line(sqlstr);