create table tb(姓名 varchar2(10) , 课程 varchar2(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);问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理 (说明:课程不一定只这三门不能写死的)
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
select tb.姓名, replace(wm_concat(to_char(tb.分数)),',',' ') as 分数
from tb
group by tb.姓名;select tb.姓名, replace(wm_concat(tb.课程||':'||to_char(tb.分数)),',',' ') as 分数
from tb
group by tb.姓名;
create table tb(姓名 varchar2(10) , 课程 varchar2(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);
SQL> select tb.姓名, replace(wm_concat(to_char(tb.分数)),',',' ') as 分数
2 from tb
3 group by tb.姓名;
/*
姓名 分数
---------- -------------------------------------------------------
李四 74 84 94
张三 74 83 93
*/
SQL> select tb.姓名, replace(wm_concat(tb.课程||':'||to_char(tb.分数)),',',' ') as 分数
2 from tb
3 group by tb.姓名;
/*
姓名 分数
---------- -------------------------------------------------------
李四 语文:74 数学:84 物理:94
张三 语文:74 数学:83 物理:93
*/
--下面是你想要得到的结果:
select tb.姓名,
max(decode(tb.课程,'语文',tb.分数)) 语文,
max(decode(tb.课程,'数学',tb.分数)) 数学,
max(decode(tb.课程,'物理',tb.分数)) 物理
from tb
group by tb.姓名;
/*
姓名 语文 数学 物理
---------- ---------- ---------- ----------
李四 74 84 94
张三 74 83 93
*/
--学校就那么几门课程,增加课程就增加下面的语句:
max(decode(tb.课程,'化学',tb.分数)) 化学
Oracle DECODE函数的语法介绍
select 姓名,sum(语文) 语文,sum(数学) 数学,sum(物理) 物理 from
(
select 姓名,sum(decode(课程,'语文',分数)) as 语文,sum(decode(课程,'数学',分数)) as 数 学,sum(decode(课程,'物理',分数)) as 物理
from tb group by 姓名,课程
) group by 姓名
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);
select sname 姓名,
sum(decode(SCLASS, '语文', SCORE)) 语文,
sum(decode(SCLASS, '物理', SCORE)) 物理,
sum(decode(SCLASS, '数学', SCORE)) 数学
from tb
group by sname
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.列转行
create table bt as select sname 姓名,
sum(decode(SCLASS, '语文', SCORE)) 语文,
sum(decode(SCLASS, '物理', SCORE)) 物理,
sum(decode(SCLASS, '数学', SCORE)) 数学
from tb
group by sname2.根据列转行结果再行转列
select a.姓名 sname, decode(b.lv, 1, '语文', 2, '物理', 3, '数学') sclass,
decode(b.lv, 1, a.语文, 2, a.物理, 3, a.数学) score
from bt a, (select level lv from dual connect by level <4) b