在实际使用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。
全部