数据库行列转换

php中文网
发布: 2016-06-07 17:37:04
原创
1912人浏览过

虽然开发过程中没用过行列转换,但是听说面试时常常会遇到这个问题,以前在网上也看到过大神的例子,今天自己仔细的玩了下,希望和大家分享一下了。 注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦,全部是我自己写的,用到了系统的SysColum

虽然开发过程中没用过行列转换,但是听说面试时常常会遇到这个问题,以前在网上也看到过大神的例子,今天自己仔细的玩了下,希望和大家分享一下了。

注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦,全部是我自己写的,用到了系统的SysColumns

(一)行转列的方法

先说说行转列的方法,这个就比较好想了,利用拼sql和case when解决即可

实现目的

1:建立测试用的数据库

CREATE TABLE RowTest( [Name] [nvarchar](10) NULL,--名稱 [Course] [nvarchar](10) NULL,--課程名稱 [Record] [int] NULL--課程的分數 )

2:加入测试用的数据库(先加入整齐的数据)

insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,) insert into RowTest values (,,)

3:设计想法

  行转列的原理就是把行的类别找出来当做查询的字段,利用case when 把当前的分数加到当前的字段上去,最后用group by 把数据整合在一起

 

4:通用方法

declare @sql nvarchar(max) @sql=@sql+++TCourse.Course++TCourse.Course from (select distinct Course from RowTest)TCourse print @sql exec(@sql)

说明: 把所有的课程名称取出来作为列(查询表TCourse)

        用case when 的方法把sql 拼出来

5:课外试验

(1)加入数据

insert into dbo.RowTest values (,,)

 

  去除max 方法会报错,因为一条可能对应多行数据

(2)加入数据

知我AI·PC客户端
知我AI·PC客户端

离线运行 AI 大模型,构建你的私有个人知识库,对话式提取文件知识,保证个人文件数据安全

知我AI·PC客户端 0
查看详情 知我AI·PC客户端

insert into dbo.RowTest values (,,)

数据会多出一列,但是其他人无此课程就会为0

至此,数据行转列ok 

(二)列转行的新方法开始了

实现目的

 

1:实现原理

在网上看了别人的做法,,基本都是用union all 来一个个转换的,我觉得不太好用。

首先我想到了要把所有的列名取出来,就在网上查了下获取表的所有列名

 然后我可以把主表和列名形成的表串起来,这样就可以形成需要的列数,然后根据判断取值就完成了了,呵呵

2:建立表格

create table CoulumTest ( Name nvarchar(10), 语文 int, 数学 int, 英语 int )

3:加入数据

insert into CoulumTest values(N,90,91,92) insert into CoulumTest values(N,80,81,82)

4:经典的地方来了

select CT.Name,Col.name 课程, (then CT.语文 when Col.name=N then CT.数学 when Col.name=Nthen CT.英语 end ) as 分数 from CoulumTest CT left join ()) Col on Col.name

你没看错,一句话搞定,但是有个问题迷惑了我,我觉得还不够简化,如果可以把case when 都不用了就更好了,请大神们指点小弟一下了。怎么根据

Col的name 直接取得分数

 

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号