# 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>