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班);
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

 



以上是关于PIVOT和UNPIVOT使用详解的主要内容,如果未能解决你的问题,请参考以下文章

pivot和unpivot函数

使用 Pivot 或 UnPivot 动态获取输出

oracle pivot 和 unpivot 函数的使用

使用 PIVOT/UNPIVOT 将行转换为列

PIVOT、UNPIVOT 转换行与列

如何在不使用pivot和unpivot的情况下在SQL Server中水平显示数据?