oracle查询结果行列转换,怎样进行oracle的查询结果的行列互换?

在实际使用sql工作中总会碰到将某一列的值放到标题中显示。就是总说的行列转换或者互换。

比如有如下数据:

ID NAME

KECHENG

CHENGJI

-- ---------- -------------------- -------

1

a

语文

80

2

a

数学

70

3

b

语文

40

4

b

数学

100

5

c

语文

90

6

c

数学

92

那末我要求显示的结果是:

NAME

YUWEN

SHUXUE

---------- ---------------------- ----------------------

a

80

70

也就是说把课程这一列放到行上显示。

把成绩按照课程分配到相对应的行。

我只介绍2中简单易用的方法,使用游标或者建立临时表的方法就不介绍了。效率很慢,不易理解。

首先建立表:

*/

create table fzq

(

id varchar

(2),

name varchar

(10),

kecheng varchar(20),

chengji varchar

(3)

);

--插入数据:

insert into fzq values ('1','a','语文','80');

insert into fzq values('2','a','shuxue','70');

insert into fzq values ('3','b','yuwen','40');

insert into fzq values ('4','b','shuxu','100');

insert into fzq values ('5','c','yuwen','90');

insert into fzq values ('6','c','shuxu','92');

/*首先使用union。

如果课程这列有多个值,那么脚本的代码就很长了。*/

select name,sum(yuwen) yuwen,sum(shuxue) shuxue from

(

select name,chengji yuwen,'0' shuxue from fzq

where kecheng='yuwen' union

select name,'0' yuwen,chengji

shuxue

from fzq

where kecheng='shuxue'

) aaa

group BY name;

/*执行结果:

NAME

YUWEN

SHUXUE

---------- ---------------------- ----------------------

a

80

70

b

40

100

c

90

92

*/

/*

其次是用case。

这种方法代码比较短。适合列值很多的情况。

*/

select name, sum(case kecheng when 'yuwen' then chengji end) yuwen,

sum(case kecheng

when 'shuxue' then chengji

end) shuxue

from fzq

group by name;

/*执行结果:

NAME

YUWEN

SHUXUE

---------- ---------------------- ----------------------

a

80

70

b

40

100

c

90

92

所有例子在oracle中测试,sql server没有测试,请根据实际情况修改

*/

select name,sum(decode(kecheng ,'语文', chengji ,null)) "语文",

sum(decode(kecheng ,'数学', chengji ,null)) "数学",

sum(decode(kecheng ,'英语', chengji ,null)) "英语"

from fzq

group by name。

全部

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值