欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

oracle动态行转列解决思路

更新时间: 2014-01-05 02:14:54 责任编辑: Author_N1

 

oracle动态行转列
例:学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
变成(得到如下结果): 
姓名 语文 数学 物理 
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)


静态写法

1、case when 写法 

select  姓名,
      max(case 课程 when  '数学' then 分数 else  0 end 数学,
      max(case 课程 when  '语文' then 分数 else  0 end 语文,
            max(case 课程 when  '物理' then 分数 else  0 end 物理
from  TB  group  by  姓名

2、decode写法
select  姓名,
      max(decode (课程,'数学',分数,0)) 数学,
      max(decode (课程,'语文',分数,0)) 语文,
            max(decode (课程,'物理',分数,0)) 物理
from  TB  group  by  姓名

动态写法
执行下面存储过程报值太多的错
declare
 lv_sql varchar2(1000);
 sql_command varchar2(5000);
  cursor   cur   is   select   课程   from   TB   group   by   课程;
 begin
  sql_command := 'select 姓名';
  for i in cur loop
  
    -- decode 写法
    sql_command := sql_command||' , max(decode(课程,'''||i.课程||''', 分数,0)) ' ||i.课程;
    -- case when 写法
    sql_command := sql_command||',max(case 课程 when '''||i.课程||''' then 分数 else 0 end ' || i.课程;
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:14:54
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/7523/
本文WWW.DOC100.NET DOC100.NET版权所有。