sqlserver下将数据库记录的列记录转换成行记录的
在 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查询字符串
```
编程语言
- sqlserver下将数据库记录的列记录转换成行记录的
- JS获取时间的方法
- js如何获取网页所有图片
- .NET中的枚举用法浅析
- JSP与Servlet的介绍说明
- 在vue项目中使用Nprogress.js进度条的方法
- jQuery.form.js插件不能解决连接超时(timeout)的原因分
- .net core整合log4net的解决方案
- PHP编程获取各个时间段具体时间的方法
- 解决JSP保存到数据库丢失格式的方法
- THINKPHP5.1 Config的配置与获取详解
- 微信小程序 调用远程接口 给全局数组赋值代码实
- 鼠标悬停小图标显示大图标
- php中Ctype函数用法详解
- select into 和 insert into select 两种表复制语句
- php数值转换时间及时间转换数值用法示例