PIVOT和UNPIVOT使用详解
Posted xiaofengfree
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PIVOT和UNPIVOT使用详解相关的知识,希望对你有一定的参考价值。
一、使用PIVOT实现数据表的列转行
建表语句:
1 DROP TABLE STUDENT; 2 CREATE TABLE STUDENT ( 3 学生编号 VARCHAR2(20 BYTE) NULL , 4 姓名 VARCHAR2(20 BYTE) NULL , 5 性别 VARCHAR2(20 BYTE) NULL , 6 所属班级 VARCHAR2(20 BYTE) NULL 7 ) 8 ; 9 10 -- ---------------------------- 11 -- Records of STUDENT 12 -- ---------------------------- 13 INSERT INTO STUDENT VALUES (‘1‘, ‘李妹妹‘, ‘女‘, ‘初一 1班‘); 14 INSERT INTO STUDENT VALUES (‘2‘, ‘泰强‘, ‘男‘, ‘初一 1班‘); 15 INSERT INTO STUDENT VALUES (‘3‘, ‘泰映‘, ‘男‘, ‘初一 1班‘); 16 INSERT INTO STUDENT VALUES (‘4‘, ‘何谢‘, ‘男‘, ‘初一 1班‘); 17 INSERT INTO STUDENT VALUES (‘5‘, ‘李春‘, ‘男‘, ‘初二 1班‘); 18 INSERT INTO STUDENT VALUES (‘6‘, ‘吴歌‘, ‘男‘, ‘初二 1班‘); 19 INSERT INTO STUDENT VALUES (‘7‘, ‘林纯‘, ‘男‘, ‘初二 1班‘); 20 INSERT INTO STUDENT VALUES (‘8‘, ‘徐叶‘, ‘女‘, ‘初二 1班‘); 21 INSERT INTO STUDENT VALUES (‘9‘, ‘龙门‘, ‘男‘, ‘初三 1班‘); 22 INSERT INTO STUDENT VALUES (‘10‘, ‘小红‘, ‘女‘, ‘初三 1班‘); 23 INSERT INTO STUDENT VALUES (‘11‘, ‘小李‘, ‘男‘, ‘初三 1班‘); 24 INSERT INTO STUDENT VALUES (‘12‘, ‘小黄‘, ‘女‘, ‘初三 2班‘); 25 INSERT INTO STUDENT VALUES (‘13‘, ‘旺财‘, ‘男‘, ‘初三 2班‘); 26 INSERT INTO STUDENT VALUES (‘14‘, ‘强强‘, ‘男‘, ‘初二 1班‘);
语法:
1 SELECT 2 3 <未透视的列>, 4 5 [第一个透视列] AS <列别名>, 6 7 [第二个透视列] AS <列别名>, 8 9 ... 10 11 [最后一个透视列] AS <列别名> 12 13 FROM ( 14 15 <SELECT查询> 16 17 ) AS <源表> 18 19 PIVOT ( 20 21 <聚合函数>(<列>) 22 23 FOR [<需要转换为行的列>] IN ( 24 25 [第一个透视列], [第二个透视列], 26 27 ... 28 29 [最后一个透视列] 30 31 ) 32 33 ) AS <数据透视表> 34 35 <可选的ORDER BY子句>;
示例如语句:
1 SELECT 2 ‘班级总人数:‘ AS 总人数, 3 初一1班, 4 初一2班, 5 初二1班, 6 初三1班, 7 初三2班 8 FROM 9 ( 10 SELECT 11 所属班级,学生编号 12 FROM 13 student 14 ) PIVOT ( 15 COUNT (学生编号) FOR 所属班级 IN ( 16 ‘初一 1班‘ AS 初一1班, 17 ‘初一 2班‘ as 初一2班, 18 ‘初二 1班‘ as 初二1班, 19 ‘初三 1班‘ as 初三1班, 20 ‘初三 2班‘ as 初三2班 21 ) 22 );
二、使用UNPIVOT 实现的功能其实与PIVOT恰恰相反
建表语句:
1 create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int); 2 insert into Fruit values(1,‘苹果‘,1000,2000,3300,5000); 3 insert into Fruit values(2,‘橘子‘,3000,3000,3200,1500); 4 insert into Fruit values(3,‘香蕉‘,2500,3500,2200,2500); 5 insert into Fruit values(4,‘葡萄‘,1500,2500,1200,3500); 6 select * from Fruit
语法同PIVOT但是UNPIVOT的子句没有聚合函数
语法:
1 SELECT 2 3 <未逆透视的列>, 4 5 [合并后的列] AS <列别名>, 6 7 [行值的列名] AS <列别名> 8 9 FROM ( 10 11 <SELECT查询> 12 13 ) AS <源表> 14 15 UNPIVOT ( 16 17 <行值的列名> 18 19 FOR <将原来多个列合并到单个列的列名> IN ( 20 21 [第一个合并列], [第二个合并列], 22 23 ... 24 25 [最后一个合并列] 26 27 ) 28 29 ) AS <数据逆透视表> 30 31 <可选的ORDER BY子句>;
示例语句:
1 select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )
以上是关于PIVOT和UNPIVOT使用详解的主要内容,如果未能解决你的问题,请参考以下文章