SQL Server技巧:行转列数据操作指南

1 下载量 164 浏览量 更新于2024-08-28 收藏 354KB PDF 举报
"本文将介绍如何在SQL Server中将行数据转换为列数据,通过创建一个简单的`student`表并填充数据,然后使用`CASE WHEN`语句配合聚合函数实现数据转换。" 在SQL Server中,有时候我们需要将数据库中的行数据转换为列数据,以便于分析或展示。这种转换通常在数据报表或者数据分析场景中非常常见。在这个例子中,我们将通过创建一个`student`表来演示如何实现这个过程。 首先,我们创建一个名为`student`的表,它包含以下字段: - `id`: 自增主键,类型为`int` - `name`: 学生姓名,类型为`nvarchar`,允许空值 - `project`: 项目名称,类型为`nvarchar`,允许空值 - `score`: 项目得分,类型为`int`,允许空值 创建表的SQL语句如下: ```sql use [test1]; go create table [dbo].[student]( [id] [int] identity(1,1) not null, [name] [nvarchar](50) null, [project] [nvarchar](50) null, [score] [int] null, constraint [pk_student] primary key clustered ( [id] asc ) with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary] ); ``` 接着,我们向`student`表中插入一些数据,以张三和李四两位同学的四个不同项目的分数为例: ```sql insert into test1.dbo.student(name, project, score) values('张三', 'android', '60'), ('张三', 'ios', '70'), ('张三', 'html5', '55'), ('张三', '.net', '100'), ('李四', 'android', '60'), ('李四', 'ios', '75'), ('李四', 'html5', '90'), ('李四', '.net', '100'); ``` 要将行数据转换为列数据,我们可以使用`CASE WHEN`语句结合聚合函数(如`MAX`)。在这个例子中,我们希望按学生姓名分组,并将每个学生的各个项目得分显示为单独的列。以下是实现这一转换的SQL查询: ```sql select name, max(case project when 'android' then score end) as '安卓', max(case project when 'ios' then score end) as '苹果', max(case project when 'html5' then score end) as 'html5', max(case project when '.net' then score end) as '.NET' from test1.dbo.student group by name; ``` 这个查询的解释如下: - `name`:按照学生姓名进行分组 - `max(case project when 'android' then score end) as '安卓'`:检查`project`字段是否为'android',如果是,则返回对应的`score`,最后使用`MAX`函数找出每个学生在'android'项目的最高分 - 其他类似`'ios'`、`'html5'`、`'.net'`的列也是同样的逻辑 通过这种方式,我们可以将原始的行数据(每个学生的所有项目得分)转换为列数据(每个学生每项目的最高分)。这种方法对于处理具有多种分类的数据非常有用,可以更清晰地展示数据结构。