当前位置:文章写作网 >日记 >日记 >sql 行列互换

sql 行列互换

2009-06-09 11:36 作者:tshfang 阅读量:11609 推荐36次 | 我要投稿

/*

在实际使用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','数学','70');

insert into fzq

values ('3','b','语文','40');

insert into fzq

values ('4','b','数学','100');

insert into fzq

values ('5','c','语文','90');

insert into fzq

values ('6','c','数学','92');

/*

首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.

*/

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

from

(

select name,chengji yuwen,'0' shuxue

from fzq

where kecheng='语文'

union

select name,'0' yuwen,chengji shuxue

from fzq

where kecheng='数学'

) aaa

group BY name;

/*执行结果:

NAME YUWEN SHUXUE

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

a 80 70

b 40 100

c 90 92

*/

/*

其次是用case.这种方法代码比较短.适合列值很多的情况.

*/

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

sum(case kecheng when '数学' then chengji end) shuxue

from fzq

group by name;

/*执行结果:

NAME YUWEN SHUXUE

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

a 80 70

b 40 100

c 90 92

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

如果有更好的方法,欢迎反馈.

*/

其他人在看啥

    《sql 行列互换》的评论 (共 0 条)

    • 鲲鹏:看不太懂
    • Guest::good
    • Guest::good
    • Guest::piaoliang
    • Guest:很佩服你,不但技术好,表达能力也好。 本人qq: 463782685 希望加好友,一起探讨sql以及erp
    • Guest:学习了,多谢