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