SQL Server 行转列

在SQL Server 2005中PIVOT 用于将列值转换为列名(行转列),在SQL Server 2000中是没有这个关键字的 只能用case语句实现。

--创建测试数据库
use master
go
if ( exists (select * from sys.databases where name = 'webDB') )
drop database webDB
go
create database webDB on primary
(
name = 'webDB',
filename = 'f:\database\webDB.mdf',
size = 5mb,
maxsize = unlimited,
filegrowth = 10%
)
log on
(
name = 'webDB_log',
filename = 'f:\database\webDB_log.ldf',
size = 3mb,
maxsize = 50mb,
filegrowth = 2mb
) use webDB
go --创建测试表
if( exists ( select * from sys.objects where name = 'student'))
drop table student
go
create table student
(
id int identity(1,1) primary key,
name varchar(20) not null,
subject varchar(20) not null,
score int not null
) --插入测试数据
insert into student values ('张三','语文',90),
('张三','数学',100),
('张三','英语',80),
('李四','英语',90),
('王五','语文',90),
('李四','语文',90),
('李四','数学',70),
('王五','数学',62),
('王五','英语',82) select * from student

SQL Server 2000 行转列

select name as 姓名,
SUM(case [subject] when '语文' then score else 0 end) as '语文',
SUM(case [subject] when '数学' then score else 0 end ) as '数学',
SUM(case [subject] when '英语' then score else 0 end ) as '英语'
from student group by name

如图所示,已经按照脚本中指定的列名进行转换,但这样做需要知道表中都有哪些数据可以作为列。通常将这种方法称为静态方法。

declare @sql varchar(1000)
set @sql = 'select name as 姓名 , '
select @sql = @sql + 'sum(case [subject] when ''' + [subject] + ''' then score else 0 end ) as '''
+ QUOTENAME([subject]) + ''',' from (select distinct [subject] from student ) as s --后加逗号,然后截取最后一个逗号
select @sql = LEFT(@sql,len(@sql)-1) + ' from student group by name ' print(@sql)
exec(@sql) select QUOTENAME('aa[]bb') --其中quotename 用于将字符串为有效的标识符

这种方法不需要知道到底需要将哪些数据作为列转换,它会自动去数据中查找不重复的数据,都会作为列来显示。通常将这种方法称为动态方法,拼接sql方法。

SQL Server 2005 行转列

select * from (
select name,[subject],score from student
) s pivot (sum(score) for [subject] in (语文,数学,英语)) as pvt
order by pvt.name

PIVOT语法是:PIVOT(聚合函数(列) for 列 in (值,值,值)) as p

这个是静态方法行转列,怎么样代码简洁吧。

declare @sql_str varchar(1000)
declare @sql_col varchar(1000)
select @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME([subject]) from student group by [subject] --先确定要转换的列名
set @sql_str = '
select * from (
select name,[subject],score from student
) s pivot (sum(score) for [subject] in (' + @sql_col + ')) as pvt
order by pvt.name'
print(@sql_str)
exec(@sql_str)

以上2005中动态创建方法。

SQL Server 列转行

在SQL Server 2005中UNPIVOT用于将列名转换为值(列转行),在SQL Server 2000中只能用UNION语句实现。

use webDB
go
--创建测试表
if( exists ( select * from sys.objects where name = 'student'))
drop table student
go
create table student
(
id int identity(1,1) primary key,
name varchar(20) not null,
语文 int not null,
英语 int not null,
数学 int not null
) --插入测试数据
insert into student values ('张三',87,90,62),
('李四',87,90,65),
('王五',23,90,34) select * from student

SQL Server 2000中列转行

SQL Server 2000 静态方法

select * from (
select name,课程='语文',分数=语文 from student
union all
select name,课程='数学',分数=数学 from student
union all
select name,课程='英语',分数=英语 from student
) t order by name, case 课程 when '语文' then 1 when '数学' then 2 when '英语' then 3 end

SQL Server 2000 动态SQL

declare @sql varchar(1000)
select @sql = ISNULL(@sql + ' union all ','') + ' select name,课程='
+ QUOTENAME(name,'''')+' , 分数 = ' + QUOTENAME(name) + ' from student' from syscolumns
where id=object_id('student') and name not in ('id','name')
print(@sql)
exec(@sql)

SQL Server 2005 静态SQL 使用UNPIVOT关键字

select name,课程,分数 from student unpivot (分数 for 课程 in (语文,英语,数学)) s

SQL Server 2005 动态SQL

declare @sql varchar(1000)
select @sql = isnull(@sql + ',','') + quotename(name) from syscolumns
where id = object_id('student') and name not in ('id','name')
order by colid
set @sql = 'select name,课程,分数 from student unpivot (分数 for 课程 in ('+@sql+')) s'
print(@sql)
exec(@sql)

12、SQL Server 行列转换的更多相关文章

  1. SQL Server 行列转换

    /* 标题:普通行列转换(version 2.0) 作者:范中磊 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql ...

  2. [转载]SQL Server行列转换实现

    可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_ ...

  3. SQL SERVER 行列转换(动态)

    行转列测试数据: --测试数据 if not object_id(N'Tempdb..#T') is null drop table #T Go Create table #T([Name] nvar ...

  4. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  5. SQL Server数据库转换成oracle

    来源:http://blog.csdn.net/hzfu007/article/details/6182151 经常碰到需要把sql server的数据迁移到Oracle的情况. 在网上查找一下,有很 ...

  6. SQL SERVER 日期转换大全

    博客转自:http://blog.csdn.net/baiduandxunlei/article/details/9180075 CONVERT(data_type,expression[,style ...

  7. sql server 日期转换

    一.时间函数 在使用存储过程,sql函数的时候,会遇到一些对时间的处理.比如时间的获取与加减.这里就用到了sql自带的时间函数.下面我列出这些函数,方便日后记忆,使用. --getdate 获取当前时 ...

  8. Sql的行列转换

    创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...

  9. Sql实现行列转换

    从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据.今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据. ...

随机推荐

  1. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

  2. Keil MDK与h-jtag联调

    keil MDK也是可以借助h-jtag进行单步调试,写出来与大家一起分享一下. keil MDK编译器使用V4.01版本,下载地址:http://www.embedinfo.com/down-lis ...

  3. 14.5.3 Locks Set by Different SQL Statements in InnoDB

    14.5.3 Locks Set by Different SQL Statements in InnoDB 通过不同的SQL语句设置的锁 在InnoDB中 一个锁定读, 一个UPDATE 或者一个D ...

  4. Linux Shell编程(5)——shell特殊字符(下)

    {}代码块[花括号]. 这个结构也是一组命令代码块,事实上,它是匿名的函数.然而与一个函数所不同的,在代码块里的变量仍然能被脚本后面的代码访问. bash$ { local a;      a=123 ...

  5. 【搜索】【并查集】Codeforces 691D Swaps in Permutation

    题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...

  6. Java---JUnita、注解与类加载器详解以及实例

    JUnit软件测试技术(工具) 在项目中建立专门用户测试的包结构. 在Junit中,通过@Test注解,可以运行一个方法. ★ Junit注解说明 使用了@Test注解应该满足以下条件: 1) 必须是 ...

  7. cf601A The Two Routes

    A. The Two Routes time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  8. ZOJ1025-最长下降子序列

    ZOJ1025-Wooden Sticks 加工木棒问题 [问题描述] 现有n根木棒,已知它们的长度和重量.要用一部木工机一根一根地加工这些木棒.该机器在加工过程中需要一定的准备时间用于清洗机器.调整 ...

  9. poj2255

    题目大意: 树恢复??树复原?? 小Valentine非常喜欢玩二叉树的游戏,他非常喜欢在二叉树的树根上随机的写上一下大写字母,这是她创造的一个例子: D / \ / \ B E / \ \ / \ ...

  10. viewWillLayoutSubView

    当viewController的bounds又改变,调用这个方法来实现subview的位置.可重写这个方法来实现父视图变化subview跟着变化.                   > Lif ...