sql:pivot unpivot
pivot 行转列
unpivot 列转行
源码跑步起来 这是能跑起来的
源码转自 http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
insert into tb values('张三','语文',74)
insert into tb values('张三','数学',83)
insert into tb values('张三','物理',93)
insert into tb values('李四','语文',74)
insert into tb values('李四','数学',84)
insert into tb values('李四','物理',94)
go
select*from tb
go
select 姓名,
max(case 课程 when'语文' then 分数 else 0 end) 语文,
max(case 课程 when'数学' then 分数 else 0 end) 数学,
max(case 课程 when'物理' then 分数 else 0 end) 物理
from tb
group by 姓名
declare @sql varchar(max)
set @sql='select 姓名'
select @sql=@sql+',max( case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from(select distinct 课程 from tb)a--同from tb group by课程,默认按课程名排序
set @sql=@sql+' from tb group by 姓名'
exec(@sql)
------
declare @sql varchar(max)
select @sql=isnull(@sql+',','')+' max(case 课程 when '''+课程+''' then 分数 else 0 end) ['+课程+']'
from(select distinct 课程 from tb)asa
set @sql='select 姓名,'+@sql+' from tb group by 姓名'
exec(@sql)
------
select * from tb pivot(max(分数) for 课程 in( 语文,数学,物理))a
---5
declare @sql varchar(8000)
set @sql='' --初始化变量@sql
select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值
set @sql=stuff(@sql,1,1,'')--去掉首个','
set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'
exec(@sql)
--或使用isnull()
declare @sql varchar(8000)
--获得课程集合
select @sql=isnull(@sql+',','')+课程 from tb group by 课程
set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'
exec(@sql)
----
二、行转列结果加上总分、平均分
1、使用SQL Server 2000静态SQL
--SQL SERVER 2000静态SQL
select 姓名,
max(case 课程 when'语文' then 分数 else 0 end)语文,
max(case 课程 when '数学' then 分数 else 0 end)数学,
max(case 课程 when '物理' then 分数 else 0 end)物理,
sum(分数) 总分,
cast(avg(分数*1.0)as decimal(18,2))平均分
from tb
group by 姓名
姓名 语文 数学 物理 总分 平均分
---------- ----------- ----------- ----------- -----------
李四 74 84 94 252 84.00
张三 74 83 93 250 83.33
2、使用SQL Server 2000动态SQL
--SQL SERVER 2000动态SQL
declare @sql varchar(8000)
set @sql='select 姓名'
select @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from(select distinct 课程 from tb) a
set @sql=@sql+',sum(分数)总分,cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名'
exec(@sql)
3、使用SQL Server 2005静态SQL
select m.*,n.总分,n.平均分
from
(select* from tb pivot(max(分数) for 课程 in(语文,数学,物理))a)m,
(select 姓名,sum(分数)总分,cast(avg(分数*1.0)as decimal(18,2))平均分
from tb
group by 姓名)n
where m.姓名=n.姓名
4、使用SQL Server 2005动态SQL
--使用stuff()
--
declare @sql varchar(8000)
set @sql='' --初始化变量@sql
select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值
--同select @sql = @sql + ','+课程from (select distinct课程from tb)a
set @sql=stuff(@sql,1,1,'')--去掉首个','
set @sql='select m.* , n.总分,n.平均分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in ('+@sql+')) b) m ,
(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2))平均分 from tb group by 姓名) n
where m.姓名= n.姓名'
exec(@sql)
--或使用isnull()
declare @sql varchar(8000)
select @sql=isnull(@sql +',','')+ 课程 from tb group by 课程
set @sql='select m.* , n.总分,n.平均分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in ('+ @sql+')) b) m ,
(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2))平均分 from tb group by 姓名) n
where m.姓名= n.姓名'
exec(@sql)
二、列转行
1、建立表格
if object_id('tb')is not null drop table tb
go
create table tb(姓名 varchar(10),语文 int,数学 int,物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go
select*from tb
go
姓名 语文 数学 物理
---------- ----------- ----------- -----------
张三 74 83 93
李四 74 84 94
2、使用SQL Server 2000静态SQL
--SQL SERVER 2000静态SQL。
select * from
(
select 姓名,课程='语文',分数=语文 from tb
union all
select 姓名,课程='数学',分数=数学 from tb
union all
select 姓名,课程='物理',分数=物理 from tb
)t
order by 姓名,case 课程 when'语文'then 1 when'数学'then 2 when'物理'then 3 end
姓名 课程 分数
---------- ---- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
2、使用SQL Server 2000动态SQL
--SQL SERVER 2000动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql=isnull(@sql+' union all ','')+' select 姓名, [课程]='
+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'
from syscolumns
where Name!='姓名'and ID=object_id('tb')--表名tb,不包含列名为姓名的其他列
order by colid
exec(@sql+' order by 姓名')
go
3、使用SQL Server 2005静态SQL
--SQL SERVER 2005动态SQL
select 姓名,课程,分数 from tb unpivot (分数 for 课程 in([语文],[数学],[物理])) t
4、使用SQL Server 2005动态SQL
--SQL SERVER 2005动态SQL
declare @sql nvarchar(4000)
select @sql=isnull(@sql+',','')+quotename(Name)
from syscolumns
where ID=object_id('tb')and Name not in('姓名')
order by Colid
set @sql='select 姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in('+@sql+'))b'
exec(@sql)
sql:pivot unpivot的更多相关文章
- sql server pivot/unpivot 行列互转
有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的. 如下: declare @t table (StudentName nvarchar(20 ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- sql server 行转列 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot 本文转自:张志涛 原文地址: http://www.cnblogs.com/zhangzt/archive/2010/07/29/17878 ...
- SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)
SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...
- SQL Server中行列转换 Pivot UnPivot
PIVOT用于将列值旋转为列名(即行转列),在SQLServer 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列)FOR 列 in (-) )AS P 完 ...
- 综合练习: PIVOT、UNPIVOT、GROUPING SETS、GROUPING_ID_1
综合练习: PIVOT.UNPIVOT.GROUPING SETS.GROUPING_ID 问题1:Desired output: empid cnt2007 cnt2008 cnt2009 ---- ...
- [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行
原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...
- sql学习~pivot和unpivot用法
pivot 可以把列值转换为输出中的多个列. pivot 可以在其他剩余的列的值上执行聚合函数. unpivot 将列转换为列值 语法 SELECT <non-pivoted column&g ...
- SQL中PIVOT 行列转换
来源:http://www.studyofnet.com/news/295.html PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...
随机推荐
- iPhone中修改iMessage关联手机号码的终极方法
同事换iPhone时,也换了手机号码,从联通的换成移动的.但iPhone激活后,iMessage始终关联的是以前的手机号码,试了很多方法都没解决. 后来在网上找到一段视频-Fix most iMess ...
- 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据
开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...
- MVC中用Jpaginate分页 So easy!(兼容ie家族)
看过几款分页插件,觉得Jpaginate比较简约,样式也比较容易的定制,而且体验也比较好,支持鼠标滑动效果.先上效果图: 整个过程很简单,只需要3步 一.引入相关样式和脚本: 1.MVC4中,用了Bu ...
- 带你看懂Dictionary的内部实现
了解Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快,那么Dictionary是如何实现的呢? Dictionary的构造 下面的代码我看看Dictionary在构 ...
- GPU---并行计算利器
转载请引用:GPU---并行计算利器 源于阿里巴巴CCO<猿来如此>分享 1 GPU是什么 如图1所示,这台PC机与普通PC机不同的是这里插了7张显卡,左下角是显卡,在中间的就是GPU芯片 ...
- atitit.自适应设计悬浮图片的大小and 位置
atitit.自适应设计悬浮图片的大小and 位置 #--------最好使用relate定位.. 中间,图片的大小和位置走能相对table, 没有遮罩左的或者哈面儿文本的问题,要悬浮,使用top:- ...
- paip.基于urlrewrite的反向代理以及内容改写
paip.基于urlrewrite的反向代理以及内容改写 ---------反向代理 RewriteCond %{REQUEST_URI} !=/process.php RewriteRule ^( ...
- NUnitForms 测试GUI应用程序的优秀工具
著名的NUnit是单元测试的优秀工具,但是要在一个测试方法中启动GUI程序,比如Windows Form界面,这比较难做到.NUnitForms就是为解决这个问题产生的,它是NUnit的一个扩展程序, ...
- 部署rfc5766-turn-server--谷歌推荐的开源穿透服务器 [复制链接]
谷歌推荐的开源穿透服务器,包含trun和stun服务,主页:https://code.google.com/p/rfc5766-turn-server/(个人觉得可以利用这个来进一步搭建VPN,有兴趣 ...
- 关于启明星系统移除apppath配置,让系统自动获取路径来设置cookie的解决方法
启明星系统底层使用统一接口,特别是用户,用户登录后,都会建立一个 userinfo 的cookie.请看下面2个网址: http://120.24.86.232/book http://120.24. ...