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

(一)行转列的方法

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

实现目的

1:建立测试用的数据库

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

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

insert into RowTest values ('张三','语文','91')
insert into RowTest values ('张三','数学','92')
insert into RowTest values ('张三','英语','93')
insert into RowTest values ('张三','生物','94')
insert into RowTest values ('张三','物理','95')
insert into RowTest values ('张三','化学','96')

insert into RowTest values ('李四','语文','81')

insert into RowTest values ('李四','数学','82')
insert into RowTest values ('李四','英语','83')
insert into RowTest values ('李四','生物','84')
insert into RowTest values ('李四','物理','85')
insert into RowTest values ('李四','化学','86')

insert into RowTest values ('小生','语文','71')
insert into RowTest values ('小生','数学','72')
insert into RowTest values ('小生','英语','73')
insert into RowTest values ('小生','生物','74')
insert into RowTest values ('小生','物理','75')
insert into RowTest values ('小生','化学','76')

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 --- www.jbxue.com

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 ('小生','生物','110')

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

(2)加入数据

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

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

至此,数据行转列ok

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

实现目的

1:实现原理

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

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

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

2:建立表格

create table CoulumTest
( --www.jbxue.com
 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 课程,
(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 直接取得分数

SQL2005数据库行列转换的更多相关文章

  1. 数据库行列转换sql

    经常折腾数据库,常常遇到数据库行列转换的问题,下面就用一个小例子来演示下如何进行行列转换. 1.创建一张表 CREATE TABLE [android_source]( [CREATETIME] [d ...

  2. (sql server)玩转-数据库行列转换

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

  3. [数据库] SQL查询语句表行列转换及一行数据转换成两列

    原文来自:http://blog.csdn.net/Eastmount/article/details/50559008 本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两 ...

  4. Oracle学习之路-- 案例分析实现行列转换的几种方式

    注:本文使用的数据库表为oracle自带scott用户下的emp,dept等表结构. 通过一个例子来说明行列转换: 需求:查询每个部门中各个职位的总工资 按我们最原始的思路可能会这么写:       ...

  5. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  6. SQL SERVER 合并重复行,行列转换

    引用自:http://www.cnblogs.com/love-summer/archive/2012/03/27/2419778.html sql server2000 里面如何实现oracle10 ...

  7. SQL 行列转换简单示例

    SQLSERVER 2005 以后提供了新的方式进行行列转换,下面是一个实例供参考: if object_id('tb') is not null drop table tbTest go ),季度 ...

  8. Mysql实现行列转换

    前言: 最近又玩起了sql语句,想着想着便给自己出了一道题目:“行列转换”.起初瞎折腾了不少时间也上网参考了一些博文,不过大多数是采用oracle数据库当中的一些便捷函数进行处理,比如”pivot”. ...

  9. ABAP 内表的行列转换-发货通知单-打印到Excel里-NEW-(以运单号为单位显示ALV然后保存输出)

    *********************************************************************** * Title           : ZSDF003  ...

随机推荐

  1. 替换Android系统镜像system.img的方法

    之前改动了Android的系统源代码的framework层代码,定制ROM.通过make之后会生成三个镜像文件userdata.img.system.img.ramdisk.img三个文件.这个时候我 ...

  2. 用C语言实现面向对象的开发

    C语言的对象化模型 面向对象的特征主要包括: .封装,隐藏内部实现 .继承,复用现有代码 .多态,改写对象行为 采用C语言实现的关键是如何运用C语言本身的特性来实现上述面向对象的特征. 1.1 封装 ...

  3. Guava API - FluentIterable Predicate Function Odering Range Splitter

    这写API可解决的问题 1. 集合元素的过滤 - FluentIterable Predicate Range Function 1) 先说Predicate<T>,这个相当与一个过滤原则 ...

  4. axure 6.5 汉化正式版软件及注册码

    Axure公司发布了Axure RP 6.5 正式版. 官方主页: http://www.axure.com/news 官方下载: http://www.axure.com/download 视频介绍 ...

  5. OpenCV学习(5) Mat的基本操作(2)

          本章我们学习一下Mat中的常用操作,因为在后面其它的教程中,我们经常要对图像进行各种处理,也要使用这些操作. 一. Mat的复制,就是从一个矩阵A,生成相关的另一个矩阵B. (1)使用赋值 ...

  6. VMware虚拟机的磁盘文件共享给物理机

    启动VMware程序 → 选中某虚拟主机('关闭'状态) → 菜单栏'虚拟机(M)' → '设置(S)' 或直接"编辑虚拟机设置". 2 在“硬件”标签下点击“硬盘(SCSI)”→ ...

  7. Python Seaborn 笔记

    Seaborn是Python的一个制图工具库,在Matplotlib上构建,支持numpy和pandas的数据结构可视化. 他有多个内置的主题,颜色的主题 可视化单一变量,二维变量用于比较各个变量的分 ...

  8. JSON劫持漏洞攻防原理及演练

    注* 作者发表这篇文章的时间较早,某些方法可能并不是最好的解决方案,但针对这种漏洞进行的攻击还依然可见,如早期的:QQMail邮件泄露漏洞,下面介绍的是对这种攻击原理的介绍. 不久之前,我写了一篇文章 ...

  9. mysql的安全性机制

    MySQL中主要包括两种用户:root用户和普通用户,其中前者为超级管理员,拥有MySQL提供的一切权限:而普通用户则只能拥有创建用户时赋予它的权限. MySQL的安全性机制主要包括权限机制,用户机制 ...

  10. 鼠标辅助点击器(MouseClickAidHelper)

    鼠标辅助点击器(MouseClickAidHelper) 下载地址:http://www.endv.cn/product/view28.html 由天云信息开发,并已开源,功能无限制,软件解决了重复操 ...