Oracle 中的行转列,列转行

# 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

你可能感兴趣的:(oracle)