/*
在实际使用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','yuwen','80');
INSERT INTO fzq VALUES('2','a','shuxue','70');
INSERT INTO fzq VALUES ('3','b','yuwen','40');
INSERT INTO fzq VALUES ('4','b','shuxue','100');
INSERT INTO fzq VALUES ('5','c','yuwen','90');
INSERT INTO fzq VALUES ('6','c','shuxue','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没有测试,请根据实际情况修改
如果有更好的方法,欢迎交流.
*/
Oracle行列互换 横表和纵表相互转换
最新推荐文章于 2024-07-05 16:29:50 发布