12、SQL Server 行列转换

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)
时间: 2024-08-24 11:48:53

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

sql server 行列转换

SQL 列转行 2011-04-22 16:13:41 好东西,转一下,嘿嘿. * 普通行列转换 (爱新觉罗.毓华 2007-11-18于海南三亚) 假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 */ ------------------------------------------------------------------------- /* 想变成

Sql server行列转换

将列表转换为透视表的方法 SELECT kh as 款号,pm as 品名,ys as 颜色 ,isnull([95],0)as '95' ,isnull([100],0)as '100' ,isnull([105],0)as '105' ,isnull([110],0)as '110' ,isnull([115],0)as '115' FROM(select * from hj)as a pivot( max([sl]) for [cm] in([95],[100],[105],[110],[

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

原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, but 2 media families are expected according to the backup device specification”.如下图: 解决办法是首先选中击上一次备份的文件,点击Remove,去掉当前的备份文件,然后再点击OK备份.这样才能正确的备份.也在微软帮助

SQL Server数据库转换成oracle

来源:http://blog.csdn.net/hzfu007/article/details/6182151 经常碰到需要把sql server的数据迁移到Oracle的情况. 在网上查找一下,有很多方法,有用第三方工具的等,但sql server本身就提供一个"导入导出"的工具,用这个工具就可以把sql server数据转换到oracle中. 下面简单列一下操作步骤: 1. 在sql server中打开导入导出工具,在选择源数据界面上选择数据源,一般默认就可以了.输入源数据的服务器

Sql Server 日期转换大全

本博文转载,原博文:http://blog.csdn.net/baiduandxunlei/article/details/9180075 CONVERT(data_type,expression[,style])  convert(varchar(10),字段名,转换格式) 说明: 此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar) 相互转换的时候才用到. 语句 结果 SELECT CONVERT(varc

sql server 日期转换

一.时间函数 在使用存储过程,sql函数的时候,会遇到一些对时间的处理.比如时间的获取与加减.这里就用到了sql自带的时间函数.下面我列出这些函数,方便日后记忆,使用. --getdate 获取当前时间 select getdate() --dateadd 原有时间加: 2013-02-17 13:20:16 此时间加12个月 select dateadd(MONTH,12,'2013-02-17 13:20:16') --返回:2014-02-17 13:20:16.000 (参数month可

sql server行列转化和行列置换

行列转换: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成(得到如下结果): 姓名 语文 数学 物理 ---- ---- ---- ---- 李四 74   84   94 张三 74   83   93 create table sc(姓名 varchar(10),课程 varchar(10),分数 float) insert into sc select '张三','语文',74 union select 

SQL Server 逻辑转换

使用 OR 逻辑是因为它符合人们的思维习惯.用使用 OR 逻辑的逻辑表达式来确定优先级和标识锚点行之后的行,也相当直观. 但是,因为 SQL Server 优化器的工作方式,OR 逻辑在性能方面存在问题,特别是当一些被筛选的列上没有索引时. 例如,考虑这样一个筛选器“col1=5 or col2=10”.如果分别在 col1 和 col2 上有单独的索引,优化器可以先在每个索引中筛选出行,然后再对两个结果执行索引交集运算(index intersection)运算.然而,如果只在其中一列上有索引

简单的叙述下SQL中行列转换的小知识!

行列转换对于工作还是学习中总是不可避免的会遇到(虽然本人还尚未工作,萌萌哒的学生一枚),解决的方法也有很多,我这里就总结一下我所想解决的问题以及怎么去解决的方法, 可能网上已经有很多类似的方法了,有的比我的可能会更好,就当我记录一下自己的学习经历吧.这里我们列举一个关于股票的每日入账出账做一个统计然后整理数据,虽然例子可能不太合理, 但是不要太执着于这些细节,能说明问题就好,傻笑ing..... 1 列转行:按照某一列分组,将另一列作为行时列名可数,不变. 什么意思呢?话说多了反而不懂,放两张图