PIVOT和UNPIVOT使用详解

一、使用PIVOT实现数据表的列转行

建表语句:

 DROP TABLE STUDENT;
 CREATE TABLE STUDENT (
 学生编号  BYTE) NULL ,
 姓名  BYTE) NULL ,
 性别  BYTE) NULL ,
 所属班级  BYTE) NULL
 )
 ;

 -- ----------------------------
 -- Records of STUDENT
 -- ----------------------------
 ', '李妹妹', '女', '初一 1班');
 ', '泰强', '男', '初一 1班');
 ', '泰映', '男', '初一 1班');
 ', '何谢', '男', '初一 1班');
 ', '李春', '男', '初二 1班');
 ', '吴歌', '男', '初二 1班');
 ', '林纯', '男', '初二 1班');
 ', '徐叶', '女', '初二 1班');
 ', '龙门', '男', '初三 1班');
 ', '小红', '女', '初三 1班');
 ', '小李', '男', '初三 1班');
 ', '小黄', '女', '初三 2班');
 ', '旺财', '男', '初三 2班');
 ', '强强', '男', '初二 1班');

语法:

     SELECT  

     <未透视的列>,  

     [第一个透视列] AS <列别名>,  

     [第二个透视列] AS <列别名>,  

     ...  

     [最后一个透视列] AS <列别名> 

     FROM (  

     <SELECT查询> 

     ) AS <源表> 

     PIVOT (  

     <聚合函数>(<列>)  

     FOR [<需要转换为行的列>] IN (  

     [第一个透视列], [第二个透视列],  

     ...  

     [最后一个透视列]  

     )  

     ) AS <数据透视表> 

     <可选的ORDER BY子句>; 

示例如语句:

 SELECT
     '班级总人数:' AS 总人数,
     初一1班,
     初一2班,
     初二1班,
     初三1班,
     初三2班
 FROM
     (
         SELECT
             所属班级,学生编号
         FROM
             student
     ) PIVOT (
         COUNT (学生编号) FOR 所属班级 IN (
             '初一 1班' AS 初一1班,
             '初一 2班' as 初一2班,
             '初二 1班' as 初二1班,
             '初三 1班' as 初三1班,
             '初三 2班' as 初三2班
         )
     );

二、使用UNPIVOT 实现的功能其实与PIVOT恰恰相反
建表语句:

 ), Q1 int, Q2 int, Q3 int, Q4 int);
 ,,,,);
 ,,,,);
 ,,,,);
 ,,,,);
 select * from Fruit

语法同PIVOT但是UNPIVOT的子句没有聚合函数
语法:

 SELECT  

 <未逆透视的列>,  

 [合并后的列] AS <列别名>,  

 [行值的列名] AS <列别名>

 FROM (  

 <SELECT查询>

 ) AS <源表>

 UNPIVOT (  

 <行值的列名>

 FOR <将原来多个列合并到单个列的列名> IN (  

 [第一个合并列], [第二个合并列],  

 ...  

 [最后一个合并列]  

 )  

 ) AS <数据逆透视表>

 <可选的ORDER BY子句>; 

示例语句:

 select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )
上一篇:SQL Server 获取服务器信息


下一篇:[BZOJ 1135][POI2009]Lyz