设为首页 收藏本站
查看: 1001|回复: 0

[经验分享] [Sql Server] 行转列 <一>------静态转换

[复制链接]

尚未签到

发表于 2016-11-5 09:20:35 | 显示全部楼层 |阅读模式
  
  一、数据库"行转列" or "列转行"指的是 DSC0000.gif
  
       1.数据库"行转列"说的是这样一类情况:
    有时候为了数据库表的设计满足用户的动态要求(比如添加字段),我们采用定义字段名表,然后定义一个字段值的表,这样就达到了用静态表达动态,换句话说就是把数据库表中本来应该是横向的延伸转化为纵向的延伸,再换句话说就是把数据库中本应是字段的增加转化为记录条数的增加。然而,这样的设计,固然灵活,却带来了统计分析的麻烦,因为统计分析时,应该是以直观的形式进行表现。换言之,统计分析时,我们又应该显示为字段更多的那种。如果同时做到了数据存储时列的增加转换为行的增加,数据提取时又可得到列增加了的数据,数据库表的这种设计就对用户透明了。
  

  
2.通过实例来了解"行转列":

    ①在"学生成绩表(T_StudentScore)"中数据的排列为:
     DSC0001.jpg
    ②在"学生成绩表(T_StudentScore)"查询出成绩,显示给用户看的是另一张表:
     DSC0002.jpg
  

    这个例子就是一个典型的在数据提取时要把从以行增加的形式的数据转化为以列增加形式的数据。我们注意课程字段,课程里的内容在数据库存储时是以不同数据行的形式,换言之,是以行增加的形式,而输出时,课程里的内容我们要变成字段名了。
  
    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

  

  结果显示为:
DSC0003.jpg
  3.2
查询出"学生成绩表"所有信息,列名显示为中文<别名>

  使用SQL语句

--查询学生成绩表的信息
select PK_ID as '编号',Name as '姓名',Course as '课程',Score as '成绩' from T_StudentScore

  
结果显示为:
DSC0004.jpg
  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不能省略。
  

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296011-1-1.html 上篇帖子: [SQL Server]存储过程编写和优化经验 下篇帖子: SQL Server存储过程的编写和优化措施
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表