SQL Server 2017 将列数据转成行数据
在SQL Server 2017中,有时我们需要将列数据转换成行数据,以满足特定的需求。本文将介绍如何使用SQL Server 2017中的Pivot和Unpivot操作来实现这一目标。
什么是Pivot操作?
在SQL中,Pivot操作可以将行数据转换为列数据。它可以通过将不同的行视为列中的不同值,并将这些不同值以列的形式展示出来。Pivot操作通常用于生成报表和分析数据。
什么是Unpivot操作?
与Pivot相反,Unpivot操作可以将列数据转换为行数据。它可以将列中的不同值转换为多个行,并将这些值以行的形式展示出来。Unpivot操作通常用于数据分析和处理。
如何使用Pivot操作?
在SQL Server 2017中,可以使用Pivot操作将列数据转换为行数据。下面是Pivot操作的基本语法:
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregate function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN
( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
下面是一个具体的示例。假设我们有一个名为"Sales"的表,它包含了员工的销售数据,以及每个月的销售额度。我们想要将这些月份作为列,并将每个员工的销售额作为行。
CREATE TABLE Sales (
EmployeeID INT,
MonthName VARCHAR(10),
SalesAmount DECIMAL(10, 2)
)
INSERT INTO Sales (EmployeeID, MonthName, SalesAmount)
VALUES (1, 'January', 1000),
(1, 'February', 1500),
(1, 'March', 2000),
(2, 'January', 1200),
(2, 'February', 1800),
(2, 'March', 2200)
SELECT EmployeeID, January, February, March
FROM
(SELECT EmployeeID, MonthName, SalesAmount
FROM Sales) AS SourceTable
PIVOT
(
SUM(SalesAmount)
FOR MonthName IN (January, February, March)
) AS PivotTable
在上述示例中,我们首先创建了一个名为"Sales"的表,并插入了一些销售数据。
然后,我们使用嵌套查询创建了一个名为"SourceTable"的临时表,该表包含了原始数据。
接下来,我们使用Pivot操作将"SourceTable"中的数据进行转换,将月份作为列,并将每个员工的销售额作为行。我们使用SUM函数对销售额进行聚合。
最后,我们将转换后的数据存储在一个名为"PivotTable"的临时表中,并通过SELECT语句选择所需的列。
如何使用Unpivot操作?
在SQL Server 2017中,可以使用Unpivot操作将列数据转换为行数据。下面是Unpivot操作的基本语法:
SELECT <columns>
FROM
(SELECT <columns>
FROM <table>) AS SourceTable
UNPIVOT
(<value column> FOR <column name> IN
(<column list>)
) AS UnpivotTable
下面是一个具体的示例。假设我们有一个名为"Sales"的表,它包含了员工的销售数据,以及每个月的销售额。我们想要将这些员工和销售额作为列,并将月份作为行。
CREATE TABLE Sales (
EmployeeID INT,
January DECIMAL(10, 2),
February DECIMAL(10, 2),
March DECIMAL(10, 2)
)
INSERT INTO Sales (EmployeeID, January, February, March)
VALUES (1, 1000, 1500, 2000),
(2, 1200, 1800, 2200)
SELECT EmployeeID, MonthName, SalesAmount
FROM
(SELECT EmployeeID, January, February, March
FROM Sales) AS SourceTable
UNPIVOT
(SalesAmount FOR Month