一、数据库"行转列" or "列转行"指的是
1.数据库"行转列"说的是这样一类情况:
有时候为了数据库表的设计满足用户的动态要求(比如添加字段),我们采用定义字段名表,然后定义一个字段值的表,这样就达到了用静态表达动态,换句话说就是把数据库表中本来应该是横向的延伸转化为纵向的延伸,再换句话说就是把数据库中本应是字段的增加转化为记录条数的增加。然而,这样的设计,固然灵活,却带来了统计分析的麻烦,因为统计分析时,应该是以直观的形式进行表现。换言之,统计分析时,我们又应该显示为字段更多的那种。如果同时做到了数据存储时列的增加转换为行的增加,数据提取时又可得到列增加了的数据,数据库表的这种设计就对用户透明了。
2.通过实例来了解"行转列":
①在"学生成绩表(T_StudentScore)"中数据的排列为:
②在"学生成绩表(T_StudentScore)"查询出成绩,显示给用户看的是另一张表:
这个例子就是一个典型的在数据提取时要把从以行增加的形式的数据转化为以列增加形式的数据。我们注意课程字段,课程里的内容在数据库存储时是以不同数据行的形式,换言之,是以行增加的形式,而输出时,课程里的内容我们要变成字段名了。
3.数据库"列转行"又是怎样一种情况?
数据库"列转行"是数据库"行转列"的反过程,即:将上实例中的②表中数据的显示形式,转换为①表中数据的显示形式。
4.如何实现"行转列" or "列转行"
实现"行转列" or "列转行"有两种转换方法:静态转换方法、动态转换方法。采用哪一种方式,视情况而定。
以上例说明:A.当课程中的内容是固定的几项,例如课程只有语文、数学、物理,可以使用静态转换来实现,当然也可以使用动态转换方式。
B.如果课程的种类是动态变换的,这时我们只能使用动态转换方式了。
二、实例讲解"行转列"---静态转换方式
以大家熟悉的学生成绩表(T_StudentScore)为例
1.问题描述
假设有张学生成绩表(T_StudentScore)如下:
想得到下面的结果:
这个简单例子该如何实现,看下面简单的操作过程。
2.创建学生成绩表(T_StudentScore),并向表中填充数据
--创建学生成绩表T_StudentScore create table T_StudentScore(PK_ID int ,Name varchar(10) , Course varchar(10) , Score int) --更改PK_ID 的列属性,选择”是标识“,标识增量为1,也就是PK_ID 字段的数据是自增长的 --向学生成绩表添加几条成绩信息 insert into T_StudentScore values('木子' , '语文' , 74) insert into T_StudentScore values('木子' , '数学' , 83) insert into T_StudentScore values('木子' , '物理' , 93) insert into T_StudentScore values('山石' , '语文' , 74) insert into T_StudentScore values('山石' , '数学' , 84) insert into T_StudentScore values('山石' , '物理' , 94)
3.利用一般查询方式:课程为字段
3.1 简单查询出"学生成绩表"所有信息
使用SQL语句
--查询学生成绩表的信息 select * from T_StudentScore
结果显示为:
3.2 查询出"学生成绩表"所有信息,列名显示为中文<别名>
使用SQL语句
--查询学生成绩表的信息 select PK_ID as '编号',Name as '姓名',Course as '课程',Score as '成绩' from T_StudentScore
结果显示为:
4.行转列 静态方式
4.1 SQL 2000静态转换方式
--行转列 静态方法 select Name as 姓名 , max(case Course when '语文' then Score else 0 end) 语文, max(case Course when '数学' then Score else 0 end) 数学, max(case Course when '物理' then Score else 0 end) 物理 from T_StudentScore group by Name
4.2 另一种静态转换方式--行转列,静态转换 select distinct c.[Name] as 姓名, (select Score from T_StudentScore where Name=c.[Name] and Course='语文')as 语文, (select Score from T_StudentScore where Name=c.[Name] and Course='数学')as 数学, (select Score from T_StudentScore where Name=c.[Name] and Course='物理')as 物理 from T_StudentScore c
该方法的主要思想:就是把任务分成两步,第一步:把第一列生成出来;第二步,根据第一列每行的姓名取值,查询该同学各科成绩join到第一步生成的只有一个列表。distinct不能省略。