如何在MSSQL中快速将横表转换为竖表

01.什么是横表和竖表

横表和竖表是在 SQL 数据库中常见的两种数据表存储形式。在横表中,数据是按照行存储的,例如下图展现的学生成绩表:

| 学生名称 | 语文成绩 | 数学成绩 | 英语成绩 |

| -------- | -------- | -------- | -------- |

| 张三 | 80 | 90 | 70 |

| 李四 | 70 | 85 | 95 |

| 王五 | 65 | 67 | 80 |

在竖表中,数据则按照列存储,例如将上述学生成绩表转换为竖表:

| 学生名称 | 学科 | 成绩 |

| -------- | -------- | ---- |

| 张三 | 语文 | 80 |

| 张三 | 数学 | 90 |

| 张三 | 英语 | 70 |

| 李四 | 语文 | 70 |

| 李四 | 数学 | 85 |

| 李四 | 英语 | 95 |

| 王五 | 语文 | 65 |

| 王五 | 数学 | 67 |

| 王五 | 英语 | 80 |

在实际应用中,往往横表更适合存储数据,因为查询的时候不需要进行数据转换。但也存在转换为竖表的情况,例如需要进行数据可视化分析、表格联接和数据存储。那么,怎样在 SQL Server 中快速将横表转换为竖表呢?接下来的内容将给大家一一讲解。

02.使用UNPIVOT实现横表转竖表

2.1 什么是UNPIVOT

UNPIVOT 是 SQL Server 数据库中的一种转换操作,它可以将一张横表转换为竖表。在转换的过程中,会将表中的列转换为行。

2.2 使用UNPIVOT实现横表转竖表的步骤

以下是使用 UNPIVOT 转换操作将横表转换为竖表的步骤:

将表中需要转换的列进行别名设置,方便后续操作

使用 UNPIVOT 操作将列转化为行

对行转化后的键值对进行操作,包括插入到临时表中,或者对其进行联接

下面将通过一个具体的例子详细讲解如何使用 UNPIVOT 操作实现横表转换为竖表。

2.3 使用UNPIVOT实现横表转竖表的案例

假如我们有一张学生考试成绩的横表如下:

CREATE TABLE score

(

id INT PRIMARY KEY,

name VARCHAR(20),

Chinese INT,

Math INT,

English INT

)

INSERT INTO score(id,name,Chinese,Math,English)

VALUES(1,'张三',80,90,70),

(2,'李四',70,85,95),

(3,'王五',65,67,80)

我们想将其转换为竖表。可以通过下述代码实现:

SELECT id, name, subjects, score

INTO tmp

FROM score

UNPIVOT(

score FOR subjects IN (Chinese,Math,English)

) unpvt;

代码解析:

SELECT id, name, subjects, score INTO tmp:临时表 select 的结果插入到 tmp 表中

FROM score UNPIVOT(score FOR subjects IN (Chinese,Math,English)) unpvt:将 score 表中 subjects 指定个数的列转出行

转换后的竖表为:

| id | name | subjects | score |

| -- | ---- | -------- | ----- |

| 1 | 张三 | 语文 | 80 |

| 1 | 张三 | 数学 | 90 |

| 1 | 张三 | 英语 | 70 |

| 2 | 李四 | 语文 | 70 |

| 2 | 李四 | 数学 | 85 |

| 2 | 李四 | 英语 | 95 |

| 3 | 王五 | 语文 | 65 |

| 3 | 王五 | 数学 | 67 |

| 3 | 王五 | 英语 | 80 |

03.使用PIVOT实现竖表转换为横表

3.1 什么是PIVOT

类似于 UNPIVOT,PIVOT 也是 SQL Server 数据库中的一种转换操作,可以将竖表转换为横表。在转换的过程中,会将行转化为列。

3.2 使用PIVOT实现竖表转换为横表的步骤

以下是使用 PIVOT 转换操作将竖表转换为横表的步骤:

将每个列转换成一列

使用 PIVOT 函数进行旋转、汇总、聚合操作

根据需要重命名每列以及结果行名

3.3 使用PIVOT实现竖表转换为横表的案例

类似前述的学生成绩表(纵向形式)如下:

| 学生名称 | 学科 | 成绩 |

| -------- | -------- | ---- |

| 张三 | 语文 | 80 |

| 张三 | 数学 | 90 |

| 张三 | 英语 | 70 |

| 李四 | 语文 | 70 |

| 李四 | 数学 | 85 |

| 李四 | 英语 | 95 |

| 王五 | 语文 | 65 |

| 王五 | 数学 | 67 |

| 王五 | 英语 | 80 |

我们想将其转换为横表,可以通过下述代码实现:

SELECT *

FROM

(

SELECT *

FROM score_vertical

) score_vertical

PIVOT

(

AVG(score)

FOR subjects IN (Chinese, Math, English)

) pivottable;

代码解析:

SELECT *:查询将会展示 id, name, 3 个学科的平均分数。

FROM(SELECT * FROM score_vertical) score_vertical:嵌套查询的作用是临时表,原因是 PIVOT 只能用于查询,无法操作表。

PIVOT:这是 PIVOT 函数的声明,指定要转换为列的列和 PIVOT 函数的聚合方式。

AVG(score):在这个例子中,我们希望得到每个学生每个学科的平均成绩。

FOR subjects IN (Chinese, Math, English):将 3 个学科列作为 input_table 的行进行处理,然后将各个学科列作为 PIVOT 函数的列(即 output_table)。

转化后的表格如下:

| 学生名称 | Chinese AVG | Math AVG | English AVG |

| -------- | -------- | -------- | -------- |

| 张三 | 80.0000 | 90.0000 | 70.0000 |

| 李四 | 70.0000 | 85.0000 | 95.0000 |

| 王五 | 65.0000 | 67.0000 | 80.0000 |

04.总结

本文主要介绍了如何在 SQL Server 中进行横表和竖表之间的转换。当需要进行数据的可视化分析、表格联接或数据存储时,这种转换操作往往更为常见。

在横表转竖表的过程中,可以使用 UNPIVOT 函数实现。使用该操作时,需要注意对列进行别名设置、将列转化为行并对键值对进行操作等步骤。

相反,在竖表转横表的过程中,可以通过使用 PIVOT 函数实现。使用该操作时,需要注意将其它列转换成一列、使用 PIVOT 函数进行旋转、汇总、聚合操作并根据需要重命名每列以及结果行名。

总体而言,只利用 SQL Server 中的 UNPIVOT 和 PIVOT 两个操作即可实现横表和竖表之间的转换,该过程简单效率高。

数据库标签