搭建数据


create table tb_grade
(
  id integer primary key,
  user_name varchar2(20),
  course varchar2(20),
  score integer
);

insert into tb_grade values (1, '张三', '语文', 78);
insert into tb_grade values (2, '张三', '数学', 95);
insert into tb_grade values (3, '张三', '英语', 81);
insert into tb_grade values (4, '李四', '语文', 70);
insert into tb_grade values (5, '李四', '数学', 82);
insert into tb_grade values (6, '李四', '英语', 81);
insert into tb_grade values (7, '王五', '语文', 90);
insert into tb_grade values (8, '王五', '数学', 68);
insert into tb_grade values (9, '王五', '英语', 74);

commit;



然后select


SQL> select * from tb_grade;

        ID USER_NAME            COURSE                    SCORE
---------- -------------------- -------------------- ----------
         1 张三                 语文                         78
         2 张三                 数学                         95
         3 张三                 英语                         81
         4 李四                 语文                         70
         5 李四                 数学                         82
         6 李四                 英语                         81
         7 王五                 语文                         90
         8 王五                 数学                         68
         9 王五                 英语                         74

已选择9行。

SQL>




行转列后:


SQL> select t.user_name,
  2    sum(decode(t.course, '语文', score, null)) chinese,
  3    sum(decode(t.course, '数学', score, null)) math,
  4    sum(decode(t.course, '英语', score, null)) english
  5  from tb_grade t group by t.user_name order by t.user_name;

USER_NAME               CHINESE       MATH    ENGLISH
-------------------- ---------- ---------- ----------
李四                         70         82         81
王五                         90         68         74
张三                         78         95         81

SQL>



decode函数:

decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)


该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF


查看过程

先decode

SQL> select t.user_name,
  2   decode(t.course, '语文', score, null) chinese,
  3   decode(t.course, '数学', score, null) math,
  4   decode(t.course, '英语', score, null) english
  5   from tb_grade t;

USER_NAME               CHINESE       MATH    ENGLISH
-------------------- ---------- ---------- ----------
张三                         78
张三                                    95
张三                                               81
李四                         70
李四                                    82
李四                                               81
王五                         90
王五                                    68
王五                                               74

已选择9行。

SQL>



然后sum


SQL> select t.user_name,
  2    sum(decode(t.course, '语文', score, null)) chinese,
  3    sum(decode(t.course, '数学', score, null)) math,
  4    sum(decode(t.course, '英语', score, null)) english
  5  from tb_grade t group by t.user_name order by t.user_name;

USER_NAME               CHINESE       MATH    ENGLISH
-------------------- ---------- ---------- ----------
李四                         70         82         81
王五                         90         68         74
张三                         78         95         81

SQL>