SQL Server实现行列转换的简单方法

介绍

在SQL Server中,有时候需要对一些数据进行行列转换,即从行形式转换为列形式。比如,一个表格中含有每种商品不同年份的销售额,我们需要将其转换为每种商品每个年份的销售额。这时候,就需要使用行列转换的方法。

本文将介绍SQL Server实现行列转换的简单方法。

使用pivot进行行列转换

基本语法

SQL Server中提供了pivot关键字,可以非常方便地实现行列转换。

SELECT

列1,

列2,

...

FROM

源表格

PIVOT

(

聚合函数(需要进行聚合的列)

FOR

列X IN (值1, 值2, ...)

) AS 别名

其中,聚合函数为需要进行聚合的列的参数,可以是SUM、COUNT、MAX、MIN等等。

列X为源表格中需要进行行列转换的列的名称,这个列包含的所有值将会成为转换后结果中的列。

IN后面的括号内是列X中包含的所有值。别名为生成的结果表格的名称。

实例

比如,我们有一张Sales表格,记录了每个地区不同时间的销售额:

CREATE TABLE Sales

(

Region VARCHAR(50),

Year INT,

SalesMoney DECIMAL(18, 0)

)

INSERT INTO Sales VALUES ('A', 2016, 10000)

INSERT INTO Sales VALUES ('B', 2017, 20000)

INSERT INTO Sales VALUES ('C', 2018, 30000)

INSERT INTO Sales VALUES ('A', 2019, 40000)

INSERT INTO Sales VALUES ('B', 2020, 50000)

我们想要将其转换为以年份为列的形式:

SELECT *

FROM

(

SELECT

Region, Year, SalesMoney

FROM

Sales

) s

PIVOT

(

SUM(SalesMoney)

FOR

Year IN (2016, 2017, 2018, 2019, 2020)

) AS pvt

查询结果如下:

Region 2016 2017 2018 2019 2020

A 10000 NULL NULL 40000 NULL

B NULL 20000 NULL NULL 50000

C NULL NULL 30000 NULL NULL

可以看出,2017年销售额为20000,转换后的表格中2017年列对应的值为20000。

使用unpivot进行列行转换

基本语法

unpivot关键字可以将列形式的数据转换为行形式的数据。其基本语法如下:

SELECT

列1,

列2,

...

FROM

源表格

UNPIVOT

(

聚合列

FOR

转换列 IN (列1, 列2, ...)

) AS 别名

其中,聚合列为需要进行聚合的列的参数,可以是SUM、COUNT、MAX、MIN等等。

转换列为需要转换的列的名称,这个列包含的所有值将会成为转换后结果中的每一行的值。

IN后面的括号内是需要转换的列。别名为生成的结果表格的名称。

实例

比如,我们有一张Sales表格,记录了每个地区不同时间的销售额:

CREATE TABLE Sales

(

Region VARCHAR(50),

Year INT,

SalesMoney DECIMAL(18, 0)

)

INSERT INTO Sales VALUES ('A', 2016, 10000)

INSERT INTO Sales VALUES ('B', 2017, 20000)

INSERT INTO Sales VALUES ('C', 2018, 30000)

INSERT INTO Sales VALUES ('A', 2019, 40000)

INSERT INTO Sales VALUES ('B', 2020, 50000)

我们想要将其转换为以地区和年份为列的形式:

SELECT

Region, Year, SalesMoney

FROM

(

SELECT

*

FROM

Sales

) p

UNPIVOT

(

SalesMoney FOR Y IN (2016, 2017, 2018, 2019, 2020)

) AS unpvt

查询结果如下:

Region Year SalesMoney

A 2016 10000

B 2017 20000

C 2018 30000

A 2019 40000

B 2020 50000

从上述结果可以看出,将列形式的数据转换为行形式的数据,便于数据的查询和处理。

总结

本文介绍了SQL Server中使用pivot和unpivot进行行列转换的方法。pivot主要是将数据从行形式转换为列形式,unpivot则是将数据从列形式转换为行形式。两种方法可以很好地应用于数据处理和报表生成中。在使用时一定注意需要进行聚合的列以及列的名称。

数据库标签