sqlserver下将数据库记录的列记录转换成行记录的

网络编程 2025-03-25 00:38www.168986.cn编程入门

在 SQL Server 中,我们经常需要将数据库记录的列转换为行记录的形式。例如,假设我们有一张学生成绩表,每个学生的各科成绩都分散在不同的行上,我们希望将它们转换为每个学生对应的各科成绩汇总在一行的形式。这样的转换在数据分析和报表生成中非常常见。以下是如何实现这一转换的方法分享。

让我们假设有一张名为“学生成绩表”(tb)的表,其中包含学生的姓名、科目和成绩。数据如下:

张三 语文 74

张三 数学 83

张三 物理 93

李四 语文 74

李四 数学 84

李四 物理 94

...(以此类推)

我们的目标是将这个表转换为每个学生对应的各科成绩汇总在一行的形式。这里有两种方法可以实现:静态SQL和动态SQL。

静态SQL方法适用于科目只有固定的几个(如语文、数学、物理等)的情况。可以使用CASE语句结合MAX函数来实现。SQL语句如下:

```sql

SELECT

name as 姓名,

MAX(CASE WHEN Subject = '语文' THEN Result ELSE 0 END) as 语文,

MAX(CASE WHEN Subject = '数学' THEN Result ELSE 0 END) as 数学,

MAX(CASE WHEN Subject = '物理' THEN Result ELSE 0 END) as 物理

FROM

tb

GROUP BY

name;

```

这个查询会按照姓名分组,并返回每个学生的语文、数学和物理成绩。如果某个科目没有成绩,MAX函数会返回0。这种方法适用于科目数量较少且固定的情况。

动态SQL方法适用于科目数量不固定的情况。这种方法需要构造一个动态的SQL查询字符串来生成所需的列。代码如下:

```sql

DECLARE @sql NVARCHAR(MAX) = ''; -- 使用NVARCHAR(MAX)来存储查询字符串以避免溢出问题

DECLARE @columns NVARCHAR(MAX) = ''; -- 存储生成的列名列表

-- 生成列名列表和查询字符串

SELECT @columns = (

SELECT

',' + QUOTENAME(Subject) + ' = max(case when Subject = ''' + Subject + ''' then Result else null end) as [' + Subject + ']'

FROM (select distinct Subject from tb) as a

FOR XML PATH('')

);

SET @sql = 'SELECT Name as 姓名 ' + @columns + ' FROM tb GROUP BY Name'; -- 完成查询字符串的构造

EXEC sp_executesql @sql; -- 执行动态SQL查询字符串

```

上一篇:JS获取时间的方法 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by