sqlserver如何列转行
时间: 2025-06-08 14:43:43 浏览: 9
### SQL Server 列转行实现方法
在 SQL Server 中,可以通过 `UNPIVOT` 关键字实现列转行的操作。以下是具体的说明和示例。
#### 使用 UNPIVOT 进行列转行
`UNPIVOT` 是 SQL Server 提供的一个关键字,用于将表中的列数据转换为行数据。它适用于需要将多个列的数据合并到单个列的情况[^3]。
以下是一个基于 `EmployeeDetails` 表的示例:
```sql
CREATE TABLE EmployeeDetails (
EmployeeID INT,
Name VARCHAR(50),
Age INT,
Salary DECIMAL(10, 2),
Department VARCHAR(50)
);
INSERT INTO EmployeeDetails (EmployeeID, Name, Age, Salary, Department)
VALUES
(1, '张三', 30, 5000.00, '开发部'),
(2, '李四', 35, 6000.00, '市场部');
```
通过 `UNPIVOT` 将指定的列(如 `Age`, `Salary`, 和 `Department`)转换为行的形式:
```sql
SELECT
EmployeeID,
AttributeName,
AttributeValue
FROM
EmployeeDetails
UNPIVOT (
AttributeValue FOR AttributeName IN ([Age], [Salary], [Department])
) AS UnpivotedData;
```
上述查询的结果将是每条记录的 `Age`, `Salary`, 和 `Department` 被展开成单独的行,并附加对应的属性名称。
---
#### 动态列转行
当需要处理不确定数量的列时,可以采用动态 SQL 来构建查询语句。例如,在 SQL Server 2014 或更早版本中,无法直接使用 `STRING_AGG` 函数,因此可以借助 `FOR XML PATH` 方法生成所需的列名列表[^2]。
以下是一个动态列转行的示例:
```sql
DECLARE @columns NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
-- 获取需要 unpivot 的列名并拼接成字符串
SELECT @columns = STUFF((
SELECT ',[' + COLUMN_NAME + ']'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EmployeeDetails' AND COLUMN_NAME NOT IN ('EmployeeID', 'Name')
FOR XML PATH('')), 1, 1, '');
-- 构建动态 SQL 查询
SET @query = '
SELECT
EmployeeID,
AttributeName,
AttributeValue
FROM
EmployeeDetails
UNPIVOT (
AttributeValue FOR AttributeName IN (' + @columns + ')
) AS UnpivotedData;';
EXEC sp_executesql @query;
```
此脚本首先获取除 `EmployeeID` 和 `Name` 外的所有列名,然后将其作为参数传递给 `UNPIVOT` 子句,从而实现了动态列转行的效果。
---
### 总结
- 静态列转行可以直接利用 `UNPIVOT` 完成。
- 如果涉及未知数量的列,则需结合动态 SQL 及 `FOR XML PATH` 方法完成任务。
相关问题
阅读全文
相关推荐















