原文:http://xace.javaeye.com/blog/434537
/*
在實際使用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沒有測試,請根據實際情況修改
如果有更好的方法,歡迎交流.
*/