目录
2)create table 表名 as select * from 结果集;
把行转列的结果建成另外一张表: demo_num 然后再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 (语文,数学,英语))