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

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

(一)行转列的方法

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

实现目的

1:建立测试用的数据库

CREATE TABLE RowTest(
[Name] [nvarchar]() NULL,--名稱
[Course] [nvarchar]() 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)
set @sql='select Name'
select @sql=@sql+','+'isnull(max( case when Course='''+TCourse.Course+''' then Record end ),0)'+TCourse.Course
from (select distinct Course from RowTest)TCourse set @sql=@sql+' from RowTest group by Name order by Name' print @sql
exec(@sql)

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

用case when 的方法把sql 拼出来

5:课外试验

(1)加入数据

insert into dbo.RowTest values ('小生','生物','')

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

(2)加入数据

insert into dbo.RowTest values ('小生','計算機','')

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

至此,数据行转列ok

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

实现目的

1:实现原理

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

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

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

2:建立表格

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

3:加入数据

insert into CoulumTest values(N'张三',,,)
insert into CoulumTest values(N'李四',,,)

4:经典的地方来了

select CT.Name,Col.name 课程,
(case when Col.name=N'语文' then CT.语文 when Col.name=N'数学' then CT.数学
when Col.name=N'英语' then CT.英语 end ) as 分数 from CoulumTest CT
left join (select name from SysColumns Where id=Object_Id('CoulumTest')) Col on Col.name<>'Name'

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

Col的name 直接取得分数

最新文章

  1. Java常用的输入输出方法
  2. 我心中的核心组件(可插拔的AOP)~分布式Session组件
  3. 如何获取eID——公安部发行的网络实名认证方式
  4. web开发中的 emmet 效率提升工具
  5. Qt实现FlatUI样式(开源)
  6. PHP程序中删除字符串最后一个字符的三种方法
  7. How To Use API Online?
  8. Apache URL转发
  9. java使用注解和反射打造一个简单的jdbc工具类
  10. RPM安装软件
  11. 【BZOJ4372】烁烁的游戏(动态点分治)
  12. zabbix基础服务搭建
  13. 迅为-IMX6UL开发板丨双网口丨双CAN总线丨4路USB HOST丨2路串口、6路插座引出,共8路串口丨1路RGB信号丨2路LVDS信号
  14. nginx配置http和https共存
  15. RestTemplate之GET和POST调用和异步回调
  16. css进阶篇
  17. 自测 基础 js 脚本。
  18. (15/24) 为webpack增加babel支持
  19. 139. Word Break (String; DP)
  20. php -- php检测文件编码的方法示例

热门文章

  1. 路由vue-router进阶
  2. Mybatis基本用法
  3. python中的字符问题
  4. ironic images
  5. apache无法启动解决办法
  6. Eclipse中安装svn的插件安装和使用
  7. 201621123033 《Java程序设计》第8周学习总结
  8. Block层也是有IO的优先级的
  9. php记日志
  10. 原 HBase 常用Shell命令