art1:列转行。需求:

示例给出这么一张表:

PL/SQL 实现行列转换_行

表定义如下:

PL/SQL 实现行列转换_转换_02

create table TEST_TB_GRADE

(   ID        NUMBER(10) not null,  

USER_NAME VARCHAR2(20 CHAR),  

COURSE    VARCHAR2(20 CHAR),  

SCORE     FLOAT )

PL/SQL 实现行列转换_转换_02

要求转换成为:

PL/SQL 实现行列转换_转换_04

下面给出一个可行的PL/SQL语句:

PL/SQL 实现行列转换_转换_02

select

t.user_name as 姓名,  

sum(decode(t.course, '语文', score,null)) as 语文,  

sum(decode(t.course, '数学', score,null)) as 数学,  

sum(decode(t.course, '英语', score,null)) as 英语

from test_tb_grade t

group by t.user_name

order by t.user_name

PL/SQL 实现行列转换_转换_02


实现效果如下图需求所示。

PL/SQL 实现行列转换_列_07

Part2:行转列。需求:

示例给出这样一张表

PL/SQL 实现行列转换_行_08

表结构如下:

PL/SQL 实现行列转换_转换_02

create table TEST_TB_GRADE2

(   ID         NUMBER(10) not null,  

USER_NAME  VARCHAR2(20 CHAR),  

CN_SCORE   FLOAT,  

MATH_SCORE FLOAT,  

EN_SCORE   FLOAT )

PL/SQL 实现行列转换_转换_02

需要转换成如下形式:

PL/SQL 实现行列转换_列_11

下面给出一个可执行的PL/SQL语句:

PL/SQL 实现行列转换_转换_02

select

user_name,

'语文'as COURSE ,

CN_SCORE as SCORE

 from test_tb_grade2  

union all

select

user_name,

'数学'as COURSE,

MATH_SCORE as SCORE

from test_tb_grade2  

union all

select user_name,

'英语'as COURSE,

EN_SCORE as SCORE

from test_tb_grade2  

order by user_name,COURSE

PL/SQL 实现行列转换_转换_02


实现效果如下图需求所示。

PL/SQL 实现行列转换_转换_14