SQL Server 行转列

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

  1. --创建测试数据库
  2. use master
  3. go
  4. if ( exists (select * from sys.databases where name = 'webDB') )
  5. drop database webDB
  6. go
  7. create database webDB on primary
  8. (
  9. name = 'webDB',
  10. filename = 'f:\database\webDB.mdf',
  11. size = 5mb,
  12. maxsize = unlimited,
  13. filegrowth = 10%
  14. )
  15. log on
  16. (
  17. name = 'webDB_log',
  18. filename = 'f:\database\webDB_log.ldf',
  19. size = 3mb,
  20. maxsize = 50mb,
  21. filegrowth = 2mb
  22. )
  23.  
  24. use webDB
  25. go
  26.  
  27. --创建测试表
  28. if( exists ( select * from sys.objects where name = 'student'))
  29. drop table student
  30. go
  31. create table student
  32. (
  33. id int identity(1,1) primary key,
  34. name varchar(20) not null,
  35. subject varchar(20) not null,
  36. score int not null
  37. )
  38.  
  39. --插入测试数据
  40. insert into student values ('张三','语文',90),
  41. ('张三','数学',100),
  42. ('张三','英语',80),
  43. ('李四','英语',90),
  44. ('王五','语文',90),
  45. ('李四','语文',90),
  46. ('李四','数学',70),
  47. ('王五','数学',62),
  48. ('王五','英语',82)
  49.  
  50. select * from student

SQL Server 2000 行转列

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

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

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

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

SQL Server 2005 行转列

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

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

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

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

以上2005中动态创建方法。

SQL Server 列转行

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

  1. use webDB
  2. go
  3. --创建测试表
  4. if( exists ( select * from sys.objects where name = 'student'))
  5. drop table student
  6. go
  7. create table student
  8. (
  9. id int identity(1,1) primary key,
  10. name varchar(20) not null,
  11. 语文 int not null,
  12. 英语 int not null,
  13. 数学 int not null
  14. )
  15.  
  16. --插入测试数据
  17. insert into student values ('张三',87,90,62),
  18. ('李四',87,90,65),
  19. ('王五',23,90,34)
  20.  
  21. select * from student

SQL Server 2000中列转行

SQL Server 2000 静态方法

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

SQL Server 2000 动态SQL

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

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

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

SQL Server 2005 动态SQL

  1. declare @sql varchar(1000)
  2. select @sql = isnull(@sql + ',','') + quotename(name) from syscolumns
  3. where id = object_id('student') and name not in ('id','name')
  4. order by colid
  5. set @sql = 'select name,课程,分数 from student unpivot (分数 for 课程 in ('+@sql+')) s'
  6. print(@sql)
  7. 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. tomcat架构分析-索引

    出处:http://gearever.iteye.com tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve ...

  2. 自动文档摘要评价方法:Edmundson,ROUGE

    自动文档摘要评价方法大致分为两类: (1)内部评价方法(Intrinsic Methods):提供参考摘要,以参考摘要为基准评价系统摘要的质量.系统摘要与参考摘要越吻合, 质量越高. (2)外部评价方 ...

  3. http头

    http://hi.baidu.com/poplarshine/item/219bbef35f1d1d10d6ff8cf9 http://www.cnblogs.com/meil/archive/20 ...

  4. SharePoint 软件边界及限制

    摘自technet http://technet.microsoft.com/zh-cn/library/cc262787.aspx

  5. c#:for循环;穷举,迭代 练习

    一)穷举 1. 第x种买法:羽毛球拍xx个,羽毛球xx个,水xx瓶 2. 单位给发了一张150元购物卡,拿着到超市买三类洗化用品.     洗发水15元,香皂2元,牙刷5元.求刚好花完150元,有多少 ...

  6. 执行计划中常见index访问方式(转)

    近期有朋友对于单个表上的index各种情况比较模糊,这里对于单个表上,单个index出现的大多数情况进行了总结性测试,给出了测试结果,至于为什么出现这样的试验结果未做过多解释,给读者留下思考的空间.本 ...

  7. paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置..

    paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置.. 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址: ...

  8. linux setsockopt

     linux setsockopt Socket描述符选项[SOL_SOCKET] #include <sys/socket.h> int setsockopt( int socket, ...

  9. Data 语义学(1)

    一.Data Member 的绑定(The binding of Data Member) extern float x; class Point3d { public: Point3d( float ...

  10. C Looooops(扩展欧几里得求模线性方程)

    http://poj.org/problem?id=2115 题意:对于C的循环(for i = A; i != B; i+=C)问在k位存储系统内循环多少次结束: 若循环有限次能结束输出次数,否则输 ...