ITPub博客

首页 > 数据库 > Oracle > 数据库开发基础---行列转换

数据库开发基础---行列转换

原创 Oracle 作者:lff1530983327 时间:2015-01-04 22:59:46 0 删除 编辑


drop table score;

create table score(

    name varchar2(10),

    subject varchar2(10),

    grade number(3)

) ;

insert into score values('Zhang','Language',80);

insert into score values('Zhang','Math',92);

insert into score values('Zhang','English',76);

insert into score values('Li','English',50);

insert into score values('Li','Math',95);

insert into score values('Li','Language',81);

insert into score values('Wang','Language',73);

commit;

select * from score;

----将score中数据转换成 name,language,math,english 的形式显示

----方法一:利用组合函数

select name,

decode(subject,'Language',grade)Language,

decode(subject,'Math',grade)Math,

decode(subject,'English',grade)English

from score;

----------------------

select name,

sum(decode(subject,'Language',grade))Language,

sum(decode(subject,'Math',grade))Math,

sum(decode(subject,'English',grade))English

from score

group by name;

-----方法二:利用oracle11g中函数pivot

select * from score

pivot (sum(grade)

       for subject

       in('Language','English','Math'));

      

1.聚合列取值。需要告诉pivot函数进行转列的过程中,聚合操作的函数和处理对象;

2.行转列标准。依据那个列进行行转列;

3.列转行取值。因为要将数据行取值转成列,我们需要告诉Oracle那些取值成列,并且这些取值成列的过程中,列顺序是如何的;

----将score1中数据转换成 name,subject,gread的形式显示

create table score1 as (select name,

sum(decode(subject,'Language',grade))Language,

sum(decode(subject,'Math',grade))Math,

sum(decode(subject,'English',grade))English

from score

group by name);

select * from score1;

--------方法1

select name, 'Language' object,language grade from score1

UNION ALL

select name, 'Math' object,math grade from score1

union all

select name, 'English' object,english grade from score1

order by name desc;

------方法二

Select * from score1

 Unpivot

 (grade for Subject in(Language,English,Math));

 

 Select * from score1

 Unpivot  EXCLUDE nulls

 (grade for Subject in(Language,English,Math));

 ----方法三

 drop table score2

 create table score2(

    name varchar2(10),

    subject varchar2(10),

    grade number(3)

) ;

-------------------

insert all

into score2 values(name,'Language',Language)

into score2 values(name,'English',English)

into score2 values(name,'Math',Math)

select name,Language,English,Math

from score1;

select * from score2;

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30018455/viewspace-1390020/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-11-12

  • 博文量
    72
  • 访问量
    49759