目录

T-SQL Pivot 和 UnPivot

精华
小牛编辑
151浏览
2023-03-14

Transact SQL 中的 Pivot 和 Unpivot 是关系运算符。可以用于将一张表转换成另一张表,以实现对桌子的清晰视图。
Pivot 运算符将行数据转换为列数据。
Unpivot 关系运算符的工作方式与 Pivot 运算符相反。它将基于列的数据转换为基于行的数据,将基于行的数据转换为基于列的数据。

语法

1. Pivot:

SELECT (ColumnNames) /Write column names  
FROM (TableName) /table name  
PIVOT  
 (   
   AggregateFunction(Column To Be Aggregate)  
   FOR PivotColumn IN (Pivot Column Value)  
 ) AS (Alias) //Alias is a name of the table

2. UnPivot:

SELECT (ColumnNames) /Name of column  
FROM (TableName)  
UNPIVOT  
 (   
Aggregate Function (Column which is Aggregated)  
FOR Pivot Column IN (PivotColumnValues)  
 ) AS (Alias)

示例1
在这里,我们创建的表名为“tb_yiibai”,值是课程名称、课程类别、价格和值。

Create Table tb_yiibai  
(   
    CourseName nvarchar(50),   
    CourseCategory nvarchar(50),  
    Price int    
)   

Insert into tb_yiibai  values('C', 'PROGRAMMING', 5000)   
Insert into tb_yiibai  values('JAVA', 'PROGRAMMING', 6000)   
Insert into tb_yiibai  values('PYTHON', 'PROGRAMMING', 8000)   
Insert into tb_yiibai  values('PLACEMENT 100', 'INTERVIEWPREPARATION', 5000)   

SELECT * FROM tb_yiibai

执行上面查询语句,得到结果如下 -

COURSE NAME    COURSE CATEGORY    PRICE
C    PROGRAMMING    5000
JAVA    PROGRAMMING    6000
PYTHON    PROGRAMMING    8000
PLACEMENT 100    INTERVIEW PREPARATION    5000

现在,将 PIVOT 运算符应用于此数据:

SELECT Course Name, PROGRAMMING, INTERVIEW PREPARATION  
FROM tb_yiibai  
PIVOT   
(   
    SUM(Price) FOR CourseCategory IN (PROGRAMMING, INTERVIEW PREPARATION )    
) AS PivotTable

使用 Pivot 运算符后,得到以下结果:

COURSE NAME    PROGRAMMING    INTERVIEW PREPARATION
C    5000    NULL
JAVA    6000    NULL
PLACEMENT 100    NULL    5000
PYTHON    8000    NULL

示例 2
使用在上面的示例中创建的同一个表“tb_yiibai”,并将 Unpivot 运算符应用于我们的 Pivoted 表。

在下面应用 UNPIVOT 运算符:

SELECT CourseName, CourseCategory, Price   
FROM   
(  
SELECT CourseName, PROGRAMMING, INTERVIEW PREPARATION FROM Javatpoint  
PIVOT   
(   
SUM(Price) FOR CourseCategory IN (PROGRAMMING, INTERVIEW PREPARATION)    
) AS PivotTable  
) P   
UNPIVOT   
(   
Price FOR CourseCategory IN (PROGRAMMING, INTERVIEW PREPARATION)   
)   
AS UnpivotTable

使用 Unpivot 运算符后,恢复了原始表,因为它已成功将表的列转换回行:

COURSE NAME    COURSE CATEGORY    PRICE
C    PROGRAMMING    5000
JAVA    PROGRAMMING    6000
PLACEMENT100    INTERVIEW PREPARATION    5000
PYTHON    PROGRAMMING    8000