SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT

概念:PIVOT提供将行转换了列的功能,UNPIVOT提供相反的功能.

PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合

用处:交叉报表

基本用法:

 

SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT SELECT   < non - pivoted  column >  ,
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
[ first pivoted column ]   AS   < column  name >  ,
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
[ second pivoted column ]   AS   < column  name >  ,
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
[ last pivoted column ]   AS   < column  name >
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
FROM
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    ( 
< SELECT  query that produces the data >  ) 
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
AS   < alias  for  the source query >
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOTPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT(
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
< aggregation  function > < column  being aggregated >  )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
FOR  
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
[ <column that contains the values that will become column headers> ]  
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
IN  (  [ first pivoted column ]  ,  [ second pivoted column ]  ,
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT 
[ last pivoted column ]  )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
AS   < alias  for  the pivot  table >
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
< optional  ORDER   BY  clause >
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT

 

示例一(查询原始一个两列四行的表):

 

SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT USE  AdventureWorks ;
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
GO
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SELECT  DaysToManufacture,  AVG (StandardCost)  AS  AverageCost 
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
FROM  Production.Product
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
GROUP   BY  DaysToManufacture
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT


 

示例二(转换行列):

 

SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT select   ' AverageCost '   as  AverageCost, *   from
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT(
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
select  DaysToManufacture, StandardCost
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
from  Production.Product
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
as  piv PIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT(
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
avg (StandardCost)
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT    
for  DaysToManufacture  in  ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
as  PivotTable


 

示例三(查询指定几位员工在各个厂商中的订单数量):

 

SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT USE  AdventureWorks;
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
GO
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SELECT  VendorID,  [ 164 ]   AS  Emp1,  [ 198 ]   AS  Emp2,  [ 223 ]   AS  Emp3,  [ 231 ]   AS  Emp4,  [ 233 ]   AS  Emp5
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
FROM  
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT(
SELECT  PurchaseOrderID, EmployeeID, VendorID
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
FROM  Purchasing.PurchaseOrderHeader) p
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOTPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT(
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
COUNT  (PurchaseOrderID)
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
FOR  EmployeeID  IN
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
[ 164 ] [ 198 ] [ 223 ] [ 231 ] [ 233 ]  )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
AS  pvt
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
ORDER   BY  VendorID
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT

结果
VendorID    Emp1        Emp2        Emp3        Emp4        Emp5
1           4           3           5           4           4
2           4           1           5           5           5
3           4           3           5           4           4
4           4           2           5           5           4
5           5           1           5           5           5


 

UNPIVOT 将与 PIVOT 执行几乎完全相反的操作,将列转换为行。假设以上示例中生成的表在数据库中存储为 pvt,并且您需要将列标识符 Emp1Emp2Emp3Emp4Emp5 旋转为对应于特定供应商的行值。这意味着必须标识另外两个列。包含要旋转的列值(Emp1Emp2...)的列将被称为 Employee,将保存当前位于待旋转列下的值的列被称为 Orders。这些列分别对应于 Transact-SQL 定义中的 pivot_columnvalue_column。以下为该查询。

 示例四(UNPIVOT):

 

SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT -- Create the table and insert values as portrayed in the previous example.
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
CREATE   TABLE  pvt (VendorID  int , Emp1  int , Emp2  int ,
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOTEmp3 
int , Emp4  int , Emp5  int )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
GO
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
INSERT   INTO  pvt  VALUES  ( 1 , 4 , 3 , 5 , 4 , 4 )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
INSERT   INTO  pvt  VALUES  ( 2 , 4 , 1 , 5 , 5 , 5 )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
INSERT   INTO  pvt  VALUES  ( 3 , 4 , 3 , 5 , 4 , 4 )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
INSERT   INTO  pvt  VALUES  ( 4 , 4 , 2 , 5 , 5 , 4 )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
INSERT   INTO  pvt  VALUES  ( 5 , 5 , 1 , 5 , 5 , 5 )
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
GO
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
-- Unpivot the table.
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
SELECT  VendorID, Employee, Orders
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
FROM  
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT   (
SELECT  VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT   
FROM  pvt) p
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOTUNPIVOT
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT   (Orders 
FOR  Employee  IN  
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT      (Emp1, Emp2, Emp3, Emp4, Emp5)
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT)
AS  unpvt
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
GO
SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT


 

结果:
VendorID   Employee   Orders
1      Emp1         4
1      Emp2         3
1      Emp3         5
1      Emp4         4
1      Emp5         4
2      Emp1         4
2      Emp2         1
2      Emp3         5
2      Emp4         5
2      Emp5         5
...

你可能感兴趣的:(sql server 2005)