5_20240301行列转

目录

课堂

1.建表 

2.行转列

1)case when 

2)decode 

​3)pivot

例题:

快速建表

1)create table 表名(字段名 数据类型)

 2)create table 表名          as       select * from 结果集;

3.列转行unpivot

作业

case when

decode

pivot

把行转列的结果建成另外一张表: demo_num 然后再unpivot列转行

1)pivot

2)unpivot


课堂

1.建表 

CREATE TABLE 学生成绩表(姓名 VARCHAR2(10),科目 VARCHAR2(10),分数 number(4,1));
--创建一个表 学生成绩表

INSERT INTO 学生成绩表 VALUES('张三','语文',100);
INSERT INTO 学生成绩表 VALUES('张三','数学',90);
INSERT INTO 学生成绩表 VALUES('张三','英语',85.5);
INSERT INTO 学生成绩表 VALUES('李四','语文',34);
INSERT INTO 学生成绩表 VALUES('李四','数学',56);
INSERT INTO 学生成绩表 VALUES('李四','英语',75.5);
INSERT INTO 学生成绩表 VALUES('老刘','语文',77);
INSERT INTO 学生成绩表 VALUES('老刘','数学',45);
INSERT INTO 学生成绩表 VALUES('老刘','英语',67.5)  ----插入数据 

COMMIT;--提交数据保存起来


select * from 学生成绩表 ;
drop table 学生成绩表;

2.行转列

1)case when 

select * from 学生成绩表 ;
select  t.姓名,
      sum(case when 科目='语文' then 分数 end) 语文成绩 ,
      sum(case when 科目='数学' then 分数 end) 数学成绩,
      sum(case when 科目='英语' then 分数 end) 英语成绩
 from  学生成绩表 t
 group by t.姓名

2)decode 

select * from 学生成绩表 ;
select  t.姓名,
      sum(decode(科目,'语文',分数)) 语文成绩 ,
      sum(decode(科目,'数学',分数)) 数学成绩,
      sum(decode(科目,'英语',分数)) 英语成绩
 from  学生成绩表 t
 group by t.姓名


3)pivot

pivot(聚合函数(要看的数据的那个列) for 要把哪些些数据变成列的字段  in (转成列的数据 ))

select  * from 学生成绩表 pivot(max(分数) 
for 科目 in ('数学'  数学成绩,'语文' 语文,'英语' 英语))

 

例题:

order_1 算出每年每个客户的总运费 ,然后再 显示为  :
客户  九六年  九七年  九八年
xx    200     300     400
we                                 

select  * from 
(select to_char(o.订购日期, 'yyyy') 年份, o.客户id, sum(o.运货费) 总运费
  from order_1 o
 group by to_char(o.订购日期, 'yyyy'), o.客户id)
 pivot(max(总运费) for 年份 in( '1996'  九六年 ,'1997' 九七年 ,'1998' "98年"))

 


快速建表

1)create table 表名(字段名 数据类型)

把一个结果集变成一张表

select to_char(o.订购日期, 'yyyy') 年份, o.客户id, sum(o.运货费) 总运费
  from order_1 o
 group by to_char(o.订购日期, 'yyyy'), o.客户id

 2)create table 表名 
         as
       select * from 结果集;

 把学生成绩表 行转列 后的结果集
 变成一张表 :学生成绩_列  

create table 学生成绩_列
 as
select  * from 学生成绩表 pivot(max(分数) for 科目 in ('语文'语文,'数学' 数学, '英语' 英语 ));

select t.* from 学生成绩_列 t;


3.列转行unpivot

unpivot(给想看的数据起的新列名 for 给你想转成行的列 起的新列名 in (原来的列名))

 


作业

create table demo(id int,name varchar(20),nums int);  ---- 创建表

insert into demo values(1, '苹果', 1000);

insert into demo values(2, '苹果', 2000);

insert into demo values(3, '苹果', 4000);

insert into demo values(4, '橘子', 5000);

insert into demo values(5, '橘子', 3000);

insert into demo values(6, '葡萄', 3500);

insert into demo values(7, '芒果', 4200);

insert into demo values(8, '芒果', 5500);

COMMIT;


SELECT * FROM demo;


SELECT name,sum(nums) FROM demo d group by name;

case when

SELECT sum(case when name='苹果' then num end)苹果,

       sum(case when name='橘子' then num end)橘子,

       sum(case when name='芒果' then num end)芒果,

       sum(case when name='葡萄' then num end)葡萄

FROM (SELECT name,sum(nums)num FROM demo d group by name); 

decode

SELECT sum(decode(name, '苹果', num)) 苹果,

       sum(decode(name, '橘子', num)) 橘子,

       sum(decode(name, '芒果', num)) 芒果,

       sum(decode(name, '葡萄', num)) 葡萄

  FROM (SELECT name, sum(nums) num FROM demo d group by name);

pivot

select *

  from (SELECT name, sum(nums) num FROM demo d group by name) f

pivot(max(num)

   for name in('苹果', '橘子', '芒果', '葡萄'));

把行转列的结果建成另外一张表: demo_num 然后再unpivot列转行

1)pivot

drop table demo_num

create table demo_num
as
select *
  from (SELECT name, sum(nums) num FROM demo d group by name) f
pivot(max(num) for name in('苹果'苹果,'橘子'橘子,'芒果'芒果 ,'葡萄'葡萄));

select * from demo_num

--切记“”之后要加字段名,要不unpivot的字段没法生成。

2)unpivot

select * from demo_num unpivot(nums for name in (苹果,橘子,芒果,葡萄))

select  * from 学生成绩_列 unpivot (成绩 for 课程 in (语文,数学,英语))

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值