PIVOT和UNPIVOT使用詳解
阿新 • • 發佈:2018-12-30
一、使用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 -- ----------------------------View Code13 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 INTOSTUDENT 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子句>;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 FruitView 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