sql中批量行转列
时间: 2025-07-24 22:11:36 浏览: 4
在 SQL 中实现行转列(即将多行数据转换为单行多列数据)的操作,通常有以下几种方法:
### 1. 使用 `CASE` 表达式实现行转列
这是最基础也是最灵活的方法,适用于静态列数的情况。
```sql
SELECT StuName,
MAX(CASE WHEN Course = '英语' THEN Score END) AS 英语,
MAX(CASE WHEN Course = '语文' THEN Score END) AS 语文,
MAX(CASE WHEN Course = '化学' THEN Score END) AS 化学
FROM Scores
GROUP BY StuName;
```
此方法通过 `CASE` 表达式判断每一行的课程名称,并将对应的成绩分配到不同的列中。由于使用了 `MAX` 聚合函数,因此可以确保即使有多个记录,也能正确提取成绩值[^1]。
### 2. 使用 `PIVOT` 实现行转列
`PIVOT` 是 SQL Server 提供的一个专门用于行转列的操作符,适用于静态列数的情况。
```sql
SELECT StuName, [英语], [语文], [化学]
FROM (
SELECT StuName, Course, Score
FROM Scores
) AS SourceTable
PIVOT (
MAX(Score)
FOR Course IN ([英语], [语文], [化学])
) AS PivotTable;
```
该方法通过 `PIVOT` 操作符将 `Course` 列中的不同值转换为单独的列,并通过 `MAX(Score)` 聚合函数提取对应的成绩值[^1]。
### 3. 使用 `UNPIVOT` 实现列转行
虽然 `UNPIVOT` 是用于列转行的操作,但通过结合其他操作,也可以实现行转列的效果。
```sql
SELECT StuName, [英语], [语文], [化学]
FROM (
SELECT StuName, Course, Score
FROM Scores
) AS SourceTable
PIVOT (
MAX(Score)
FOR Course IN ([英语], [语文], [化学])
) AS PivotTable;
```
此方法与 `PIVOT` 类似,但通常用于将宽表转换为长表,再结合其他操作实现行转列。
### 4. 使用动态 SQL 实现行转列
当列数不固定或列名未知时,可以使用动态 SQL 构建查询语句。
```sql
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SELECT @cols = STRING_AGG(QUOTENAME(Course), ', ')
FROM (SELECT DISTINCT Course FROM Scores) AS Courses;
SET @query = 'SELECT StuName, ' + @cols + '
FROM (
SELECT StuName, Course, Score
FROM Scores
) AS SourceTable
PIVOT (
MAX(Score)
FOR Course IN (' + @cols + ')
) AS PivotTable';
EXEC sp_executesql @query;
```
该方法首先动态获取所有课程名称,并将其拼接为列名列表,然后通过动态 SQL 构建 `PIVOT` 查询语句,从而实现行转列[^3]。
### 5. 使用 `CONCATENATE` 函数在 Excel 中生成 SQL 语句
如果数据存储在 Excel 中,可以通过 `CONCATENATE` 函数生成 SQL 插入语句,然后在数据库中执行。
```excel
="INSERT INTO Scores (StuName, Course, Score) VALUES ('" & A2 & "', '" & B2 & "', " & C2 & ");"
```
通过 Excel 的 `CONCATENATE` 函数,可以将 Excel 中的每一行数据转换为一条 SQL 插入语句,从而实现数据的批量导入[^4]。
### 6. 使用 `UNION ALL` 实现行转列
对于某些特定场景,可以通过 `UNION ALL` 将多列合并为多行,再通过 `GROUP BY` 实现行转列。
```sql
SELECT StuName,
MAX(CASE WHEN Course = '英语' THEN Score END) AS 英语,
MAX(CASE WHEN Course = '语文' THEN Score END) AS 语文,
MAX(CASE WHEN Course = '化学' THEN Score END) AS 化学
FROM (
SELECT StuName, Course = '英语', Score = YingYu FROM Scores
UNION ALL
SELECT StuName, Course = '语文', Score = YuWen FROM Scores
UNION ALL
SELECT StuName, Course = '化学', Score = HuaXue FROM Scores
) AS TempTable
GROUP BY StuName;
```
该方法通过 `UNION ALL` 将多个课程的成绩合并为多行,再通过 `CASE` 表达式和 `GROUP BY` 实现行转列[^1]。
---
阅读全文
相关推荐



















