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; --这样只能全部显示出来,不能达到聚合的目的