SQL 列转行
在进行数据处理和分析时,经常会遇到需要将列转化为行的情况。在 SQL 中,有时候数据存储的形式并不符合我们的需求,需要对数据进行适当的调整才能方便后续的操作。本文将详细介绍如何使用 SQL 查询语句将列转化为行,包括使用 UNION ALL
和 UNPIVOT
两种方法。
使用 UNION ALL 转换列为行
UNION ALL
是 SQL 中的关键字,在将列转换为行时经常会用到。通过 UNION ALL
关键字可以将多个查询的结果集合并为一个结果集,从而实现列转行的效果。
案例分析
假设有一个学生表 Student
,存储了学生的学号、姓名和成绩,数据结构如下:
学号 | 姓名 | 语文成绩 | 数学成绩 | 英语成绩 |
---|---|---|---|---|
1001 | 小明 | 90 | 85 | 88 |
1002 | 小红 | 75 | 80 | 82 |
1003 | 小刚 | 88 | 92 | 90 |
现在需要将该表转换为如下形式:
学号 | 姓名 | 科目 | 成绩 |
---|---|---|---|
1001 | 小明 | 语文 | 90 |
1001 | 小明 | 数学 | 85 |
1001 | 小明 | 英语 | 88 |
1002 | 小红 | 语文 | 75 |
1002 | 小红 | 数学 | 80 |
1002 | 小红 | 英语 | 82 |
1003 | 小刚 | 语文 | 88 |
1003 | 小刚 | 数学 | 92 |
1003 | 小刚 | 英语 | 90 |
SQL 查询
SELECT 学号, 姓名, '语文' AS 科目, 语文成绩 AS 成绩 FROM Student
UNION ALL
SELECT 学号, 姓名, '数学' AS 科目, 数学成绩 AS 成绩 FROM Student
UNION ALL
SELECT 学号, 姓名, '英语' AS 科目, 英语成绩 AS 成绩 FROM Student;
运行结果
学号 | 姓名 | 科目 | 成绩 |
---|---|---|---|
1001 | 小明 | 语文 | 90 |
1001 | 小明 | 数学 | 85 |
1001 | 小明 | 英语 | 88 |
1002 | 小红 | 语文 | 75 |
1002 | 小红 | 数学 | 80 |
1002 | 小红 | 英语 | 82 |
1003 | 小刚 | 语文 | 88 |
1003 | 小刚 | 数学 | 92 |
1003 | 小刚 | 英语 | 90 |
通过以上 SQL 查询语句,我们成功将列转为行,得到了我们需要的结果。
使用 UNPIVOT 转换列为行
除了使用 UNION ALL
进行列转行外,SQL 中还提供了 UNPIVOT
关键字来实现相同的功能。UNPIVOT
可以将多个列转换为行,并且比 UNION ALL
更加灵活。
案例分析
继续使用上面的学生表 Student
,我们将用 UNPIVOT
来实现将成绩列转换为行的功能。
SQL 查询
SELECT 学号, 姓名, 科目, 成绩
FROM
(
SELECT 学号, 姓名, 语文成绩, 数学成绩, 英语成绩
FROM Student
) AS s
UNPIVOT
(
成绩 FOR 科目 IN (语文成绩, 数学成绩, 英语成绩)
) AS unpivoted;
运行结果
学号 | 姓名 | 科目 | 成绩 |
---|---|---|---|
1001 | 小明 | 语文 | 90 |
1001 | 小明 | 数学 | 85 |
1001 | 小明 | 英语 | 88 |
1002 | 小红 | 语文 | 75 |
1002 | 小红 | 数学 | 80 |
1002 | 小红 | 英语 | 82 |
1003 | 小刚 | 语文 | 88 |
1003 | 小刚 | 数学 | 92 |
1003 | 小刚 | 英语 | 90 |
通过使用 UNPIVOT
关键字,我们也成功将列转为行,得到了和 UNION ALL
相同的结果。
总结
在本文中,我们介绍了通过使用 SQL 查询语句将列转为行的两种方法:UNION ALL
和 UNPIVOT
。两种方法各有优劣,具体选择哪种方法取决于具体情况和个人喜好。