Oracle unpivot列转行函数 pivot行转列函数

unpivot列转行函数

select 字段 from 数据集
unpivot(自定义列名/*列的值*/ for 自定义列名/*列名的别名,自己定义*/ in(列名))

注意 後面的是列名

create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);

insert into Fruit values(1,'苹果',1000,2000,3300,5000);
insert into Fruit values(2,'橘子',3000,3000,3200,1500);
insert into Fruit values(3,'香蕉',2500,3500,2200,2500);
insert into Fruit values(4,'葡萄',1500,2500,1200,3500);
select * from Fruit


列转行查询

select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )
注意: unpivot没有聚合函数,xiaoshou、jidu字段也是临时的变量

 

with t as (
Select '小明' name, '90' 語文 ,'17' 數學 ,'87' 英語 from dual
Union
Select '小張' name, '80' 語文 ,'77' 數學 ,'68' 英語 from dual
Union
Select '小李' name, '67' 語文 ,'37' 數學 ,'57' 英語 from dual
Union
Select '小孫' name, '45' 語文 ,'57' 數學 ,'35' 英語 from dual
Union
Select '小王' name, '68' 語文 ,'86' 數學 ,'86' 英語 from dual
Union
Select '小周' name, '48' 語文 ,'45' 數學 ,'44' 英語 from dual
)

select * from t unpivot(分數 for 科目 in (語文,數學,英語))

 

 

 

   pivot行转列函数

Select * From 表名-- 表名不变,但实际是聚合之后的表
PIVOT
(
  SUM('要合并的列1'). --操作的列  必须使用聚合函数   SUM MAX MIN 。。  显示的值是 原来表里面  转换后列名所对应的值

FOR

 将值转换成列的列名 IN        -- 后面的列值会变成列,列值所在的列
(列值1,列值2,列值3,列值4....)  --   列值 是转换后的列名 
)

with t as (
Select '桃子' name, 300 nums ,1 jidu from dual
Union
Select '苹果' name, 200 nums ,1 jidu from dual
Union
Select '西瓜' name, 100 nums ,1 jidu from dual
Union
Select '桃子' name, 111 nums ,2 jidu from dual
Union
Select '西瓜' name, 222 nums ,2 jidu from dual
Union
Select '苹果' name, 333 nums ,2 jidu from dual
)

--select * from t pivot(sum(nums) for name in ('桃子','西瓜','苹果')) order by jidu; --这样只能全部显示出来,不能达到聚合的目的

 

  

posted @ 2021-05-13 22:11  zq爱生活爱代码  阅读(195)  评论(0编辑  收藏  举报