/*
在实际使用sql工作中总会碰到将某一列的值放到标题中显示就是总说的行列转换或者互换
比如有如下数据:
ID NAME KECHENG CHENGJI
a 语文
a 数学
b 语文
b 数学
c 语文
c 数学
那末我要求显示的结果是:
NAME YUWEN SHUXUE
a
也就是说把课程这一列放到行上显示把成绩按照课程分配到相对应的行
我只介绍中简单易用的方法使用游标或者建立临时表的方法就不介绍了效率很慢不易理解
首先建立表:
*/
create table fzq
(
id varchar()
name varchar()
kecheng varchar()
chengji varchar()
);
插入数据:
insert into fzq values (a语文);
insert into fzq values(ashuxue);
insert into fzq values (byuwen);
insert into fzq values (bshuxu);
insert into fzq values (cyuwen);
insert into fzq values (cshuxu);
/*首先使用union如果课程这列有多个值那么脚本的代码就很长了*/
select namesum(yuwen) yuwensum(shuxue) shuxue from
(
select namechengji yuwen shuxue from fzq
where kecheng=yuwen union
select name yuwenchengji shuxue
from fzq
where kecheng=shuxue
) aaa
group BY name;
/*执行结果:
NAME YUWEN SHUXUE
a
b
c
*/
/*
其次是用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
b
c
所有例子在oracle中测试sql server没有测试请根据实际情况修改
*/
select namesum(decode(kecheng 语文 chengji null)) 语文
sum(decode(kecheng 数学 chengji null)) 数学
sum(decode(kecheng 英语 chengji null)) 英语
from fzq
group by name