SQL 中的透视和反透视
在 SQL 中,Pivot 和 Unpivot 是关系运算符,用于将一个表转换为另一个表,以实现更简单的表视图。按照惯例,我们可以说Pivot运算符将表的行数据转换为列数据。 Unpivot运算符的作用相反,它将基于列的数据转换为行。
句法:
1. 枢轴:
SELECT (ColumnNames)
FROM (TableName)
PIVOT
(
AggregateFunction(ColumnToBeAggregated)
FOR PivotColumn IN (PivotColumnValues)
) AS (Alias) //Alias is a temporary name for a table
2. 反透视:
SELECT (ColumnNames)
FROM (TableName)
UNPIVOT
(
AggregateFunction(ColumnToBeAggregated)
FOR PivotColumn IN (PivotColumnValues)
) AS (Alias)
示例 1:
我们创建了一个名为“geeksforgeeks”的简单表,其中包含课程名称、课程类别和价格等值,并插入了相应的值。
Create Table geeksforgeeks
(
CourseName nvarchar(50),
CourseCategory nvarchar(50),
Price int
)
Insert into geeksforgeeks values('C', 'PROGRAMMING', 5000)
Insert into geeksforgeeks values('JAVA', 'PROGRAMMING', 6000)
Insert into geeksforgeeks values('PYTHON', 'PROGRAMMING', 8000)
Insert into geeksforgeeks values('PLACEMENT 100', 'INTERVIEWPREPARATION', 5000)
SELECT * FROM geeksforgeeks
我们得到的输出是:
CourseName | CourseCategory | Price |
---|---|---|
C | PROGRAMMING | 5000 |
JAVA | PROGRAMMING | 6000 |
PYTHON | PROGRAMMING | 8000 |
PLACEMENT 100 | INTERVIEWPREPARATION | 5000 |
现在,将PIVOT运算符应用于此数据:
SELECT CourseName, PROGRAMMING, INTERVIEWPREPARATION
FROM geeksforgeeks
PIVOT
(
SUM(Price) FOR CourseCategory IN (PROGRAMMING, INTERVIEWPREPARATION )
) AS PivotTable
使用 Pivot运算符后,我们得到以下结果:
CourseName | PROGRAMMING | InterviewPreparation |
---|---|---|
C | 5000 | NULL |
JAVA | 6000 | NULL |
PLACEMENT 100 | NULL | 5000 |
PYTHON | 8000 | NULL |
示例 2:
现在,我们使用上面示例中创建的同一张表“geeksforgeeks”,并将 Unpivot运算符应用于我们的 Pivoted 表。
应用UNPIVOT 运算运算符:
SELECT CourseName, CourseCategory, Price
FROM
(
SELECT CourseName, PROGRAMMING, INTERVIEWPREPARATION FROM geeksforgeeks
PIVOT
(
SUM(Price) FOR CourseCategory IN (PROGRAMMING, INTERVIEWPREPARATION)
) AS PivotTable
) P
UNPIVOT
(
Price FOR CourseCategory IN (PROGRAMMING, INTERVIEWPREPARATION)
)
AS UnpivotTable
使用 Unpivot运算符后,我们恢复了原始表,因为我们已成功将表的列转换回行:
CourseName | CourseCategory | Price | |||
---|---|---|---|---|---|
C | PROGRAMMING | 5000 | |||
JAVA | PROGRAMMING | 6000 | PLACEMENT 100 | INTERVIEWPREPARATION | 5000 |
PYTHON | PROGRAMMING | 8000 | |||