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 两个操作即可实现横表和竖表之间的转换,该过程简单效率高。