sql语句,列转行
时间: 2025-05-18 08:11:09 浏览: 9
### SQL 语句实现列转行 Unpivot 示例教程
在关系型数据库中,`UNPIVOT` 是一种非常强大的工具,能够将宽表结构转化为窄表结构,即将多列的数据转换为单列表示形式。以下是基于 `SQL Server` 的具体实现方法。
#### 动态 SQL 使用 `UNPIVOT` 实现列转行
通过动态 SQL 可以灵活处理未知数量的列。以下是一个完整的例子:
```sql
-- 定义变量
declare @sql nvarchar(max);
declare @columns nvarchar(max);
-- 初始化列名字符串为空
set @columns = '';
-- 获取除指定列外的所有其他列名
with sub AS (
SELECT column_name
FROM INFORMATION_SCHEMA.columns
WHERE TABLE_NAME = 'stugrade'
AND column_name != 'studentname'
)
select @columns += '[' + column_name + '],' from sub;
-- 移除最后一个多余的逗号
if LEN(@columns) > 0
begin
set @columns = LEFT(@columns, LEN(@columns) - 1);
end
-- 构建最终的动态 SQL 查询
set @sql = N'
select studentname, subject, grade
from stugrade
unpivot (
grade for subject in (' + @columns + ')
) as unpivot_table';
-- 打印并执行动态 SQL
print (@sql);
exec sp_executesql @sql;
```
上述代码实现了以下几个功能:
1. **获取目标表中的所有列名**:利用 `INFORMATION_SCHEMA.COLUMNS` 查找除了 `studentname` 外的所有列[^1]。
2. **构建动态 SQL 字符串**:拼接这些列名为一个逗号分隔的字符串,并将其嵌入到 `UNPIVOT` 子查询中[^1]。
3. **执行动态 SQL**:使用 `sp_executesql` 来运行生成的 SQL 脚本[^1]。
#### 静态 SQL 使用 `UNPIVOT`
如果已知要转换的具体列,则可以直接编写静态 SQL 如下所示:
```sql
select studentname, subject, grade
from stugrade
unpivot (
grade for subject in ([语文], [数学], [英语])
) as unpivot_table;
```
此脚本假设 `stugrade` 表中有三门课的成绩分别为 `[语文]`, `[数学]`, 和 `[英语]`[^5]。
---
### 注意事项
- 如果源数据存在 NULL 值,在某些情况下可能需要额外处理来决定是否忽略它们或者填充默认值[^4]。
- 对于 Oracle 数据库而言,虽然也支持类似的逻辑操作,但其语法略有不同,请参阅相关文档或参考资料[^3]。
---
问题
阅读全文
相关推荐


















