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班');
View Code

语法:

 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子句>; 
View Code

示例如语句:

 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     );
View Code

二、使用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
View Code

语法同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子句>; 
View Code

示例语句:

1 select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )
View Code

猜你喜欢

转载自www.cnblogs.com/xiaofengfree/p/10201003.html