SQL 列转行

SQL 列转行

SQL 列转行

在进行数据处理和分析时,经常会遇到需要将列转化为行的情况。在 SQL 中,有时候数据存储的形式并不符合我们的需求,需要对数据进行适当的调整才能方便后续的操作。本文将详细介绍如何使用 SQL 查询语句将列转化为行,包括使用 UNION ALLUNPIVOT 两种方法。

使用 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 ALLUNPIVOT。两种方法各有优劣,具体选择哪种方法取决于具体情况和个人喜好。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程