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通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...
随机推荐
- sql bcp 笔记
介绍: http://blog.csdn.net/soudog/article/details/4343415 导出格式 BCP NTS.dbo.T_User format nul -f c:/Use ...
- hmailserver
开始使用: www.hmailserver.org 问题 让hmailserver的用户使用各自的中继来发送邮件: http://dagai.net/archives/968
- 曲演杂坛--为什么SELECT语句会被其他SELECT阻塞?
很多刚入门的DBA在捕获阻塞得时候,会问这么一个问题“为什么这个SELECT语句被那个SELECT语句阻塞了,难道不是共享锁么?” 让我们来做个小测试,首先准备一些测试数据: --========== ...
- php 获取中文字符拼音首字母
//php获取中文字符拼音首字母 function getFirstCharter($str){ if(empty($str)){return '';} $fchar=ord($str{}); }); ...
- CSS设计资料
CSS实现垂直居中的5种方法 网页阶级配色:http://tools.jb51.net/tools/peise.htm
- 解决TCP网络传输粘包问题
很久之前就想写一写关于TCP粘包处理的文章了,无奈一直做WEB开发 没时间研究那个,拖了很久,最近要为一个客户做winform 服务器端,要用到SOCKET就发现了这个问题,这才想起来要解决. 下面用 ...
- JS原型链简单图解
JS中原型链,说简单也简单. 首先明确: 函数(Function)才有prototype属性,对象(除Object)拥有__proto__. 首先,我画了一张图. 所谓原型链,指的就是图中的proto ...
- paip.mysql 批量kill 连接.
paip.mysql 批量kill 连接. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net ...
- 优化TableView性能
优化tableView性能(针对滑动时出现卡的现象) (2013-08-02 11:18:15) 转载▼ 标签: ios tableview it 分类: 技术文档 在iOS应用中,UITableVi ...
- RTMP协议
Real Time Messaging Protocol(实时消息传送协议协议)概述 实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频.视频和数据传输开发的私有协 ...