📜  SQL 中的透视和反透视

📅  最后修改于: 2022-05-13 01:54:44.488000             🧑  作者: Mango

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 

我们得到的输出是:

CourseNameCourseCategoryPrice
CPROGRAMMING5000
JAVAPROGRAMMING6000
PYTHONPROGRAMMING8000
PLACEMENT 100INTERVIEWPREPARATION5000

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

SELECT CourseName, PROGRAMMING, INTERVIEWPREPARATION
FROM geeksforgeeks 
PIVOT 
( 
SUM(Price) FOR CourseCategory IN (PROGRAMMING, INTERVIEWPREPARATION ) 
) AS PivotTable 

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

CourseNamePROGRAMMINGInterviewPreparation
C5000NULL
JAVA6000NULL
PLACEMENT 100NULL5000
PYTHON8000NULL

示例 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运算符后,我们恢复了原始表,因为我们已成功将表的列转换回行:

CourseNameCourseCategoryPrice
CPROGRAMMING5000
JAVAPROGRAMMING6000PLACEMENT 100INTERVIEWPREPARATION5000
PYTHONPROGRAMMING8000