1. 程式人生 > >PIVOT和UNPIVOT使用詳解

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