# 1. 行转列
原始结构:
NAME COURSE SCORE
-------------------- -------------------- ----------
zhangsan 语文 82
zhangsan 数学 96
lisi 语文 80
lisi 数学 95目标结构:
NAME 语文 数学
-------------------- ---------- ----------
zhangsan 82 96
lisi 80 95# 对应的 sql
create table t1 (name varchar2(10), course varchar2(10), score float);
insert into t1 values('zhangsan', '语文', 82);
insert into t1 values('zhangsan', '数学', 96);
insert into t1 values('lisi', '语文', 80);
insert into t1 values('lisi', '数学', 95);
SQL> select * from t1;
NAME COURSE SCORE
-------------------- -------------------- ----------
zhangsan 语文 82
zhangsan 数学 96
lisi 语文 80
lisi 数学 95
SQL> select
2 name,
3 sum(case course when '语文' then score else 0 end) 语文,
4 sum(case course when '数学' then score else 0 end) 数学
5 from t1
6 group by name;
NAME 语文 数学
-------------------- ---------- ----------
zhangsan 82 96
lisi 80 95
SQL>
# 2. 列转行
原始结构:
NAME CHINESE_SCORE MATH_SCORE
-------------------- ------------- ----------
zhangsan 82 96
lisi 80 95目标结构:
NAME COURSE SCORE
-------------------- ------------ ----------
lisi 数学 95
lisi 语文 80
zhangsan 数学 96
zhangsan 语文 82# 对应的 sql
create table t2(name varchar2(10), chinese_score float, math_score float);
insert into t2 values('zhangsan', 82, 96);
insert into t2 values('lisi', 80, 95);
SQL> select * from t2;
NAME CHINESE_SCORE MATH_SCORE
-------------------- ------------- ----------
zhangsan 82 96
lisi 80 95
SQL> select name, '语文' course, chinese_score score from t2
2 union
3 select name, '数学' course, math_score score from t2;
NAME COURSE SCORE
-------------------- ------------ ----------
lisi 数学 95
lisi 语文 80
zhangsan 数学 96
zhangsan 语文 82
SQL>
# 相关链接
http://www.2cto.com/database/201108/100792.html