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

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

用处:交叉报表

基本用法:

 

SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOTSELECT <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和UNPIVOTUSE 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和UNPIVOTselect '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和UNPIVOTUSE 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
...

相关文章: